1. ホーム
  2. javascript

[解決済み] モックされたインポートの動作を変更するには?

2023-01-12 19:08:10

質問

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')
})