web-dev-qa-db-ja.com

テストの間にインポートされたモジュールをリセットする方法

アプリの起動時に1回初期化する必要があるモジュールがあるとします(構成を渡すため)。モジュールは次のようになります。

MyModule.js

let isInitiazlied;

const myModule = {

    init: function() {
        isInitiazlied = true;
    },
    do: function() {
        if (!isInitiazlied)
            throw "error"
        //DO THINGS
    }
}

export default myModule;

Jestを使用して単体テストをしたい。テストファイルは次のようになります。

MyModule.test.js

import myModule from './MyModule'

describe('MyModule', () => {
    describe('init', () => {
        it('not throws exception when called', () => {
            expect(() => myModule.init()).not.toThrow();
        });
    })
    describe('do', () => {
        it('throw when not init', () => {
            expect(() => myModule.do()).toThrow();
        });
    })
})

テストを実行すると、モジュールはすでに初期化されているため、2番目のテストは失敗し、例外はスローされません。 beforeEachでjest.resetModules()を使用してみましたが、うまくいきませんでした。

それを解決する方法はありますか(異なるモジュールパターン/テストケース)?

7
Amico

モジュールを再インポートまたは再要求する必要があります。詳細については、ドキュメントまたはこの問題を確認してください:

https://github.com/facebook/jest/issues/3236

https://facebook.github.io/jest/docs/en/jest-object.html#jestresetmodules

describe('MyModule', () => {
    beforeEach(() => {
        jest.resetModules()
    });

    describe('init', () => {
        const myModule = require('./MyModule');

        it('not throws exception when called', () => {
            expect(() => myModule.init()).not.toThrow();
        });
    })
    describe('do', () => {
        const myModule = require('./MyModule');

        it('throw when not init', () => {
            expect(() => myModule.do()).toThrow();
        });
    })
})
14
ltamajs