Jestで実装を単体テストする方法をあざけるのはかなり混乱しています。事は私が別の予想される動作を模擬したいです。
これを達成する方法はありますか?インポートはファイルの一番上にしかできないため、インポートの前に宣言する必要があるものをモックできるようにします。また、動作を上書きできるようにローカル関数を渡そうとしましたが、jestは、ローカルに渡すことは許可されていないと文句を言います。
_jest.mock('the-package-to-mock', () => ({
methodToMock: jest.fn(() => console.log('Hello'))
}));
import * as theThingToTest from '../../../app/actions/toTest'
import * as types from '../../../app/actions/types'
it('test1', () => {
expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE)
})
it('test2', () => {
//the-package-to-mock.methodToMock should behave like something else
expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE)
})
_
ご想像のとおり、theThingToTest.someAction()
は_the-package-to-mock.methodToMock
_を使用します
スパイをモックして、モックされたモジュールをインポートできます。テストでは、 mockImplementation
を使用してモックの動作を設定します。
jest.mock('the-package-to-mock', () => ({
methodToMock: jest.fn()
}));
import {methodToMock} from 'the-package-to-mock'
it('test1', () => {
methodToMock.mockImplementation(() => 'someValue')
})
it('test2', () => {
methodToMock.mockImplementation(() => 'anotherValue')
})
spyOn
が最適でした。前の回答を参照してください:
次のパターンを使用します。
'use strict'
const packageToMock = require('../path')
jest.mock('../path')
jest.mock('../../../../../../lib/dmp.db')
beforeEach(() => {
packageToMock.methodToMock.mockReset()
})
describe('test suite', () => {
test('test1', () => {
packageToMock.methodToMock.mockResolvedValue('some value')
expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE)
})
test('test2', () => {
packageToMock.methodToMock.mockResolvedValue('another value')
expect(theThingToTest.someAction().type).toBe(types.OTHER_TYPE)
})
})
説明:
テストスイートレベルで使用しようとしているクラスをモックし、各テストの前にモックがリセットされていることを確認します