web-dev-qa-db-ja.com

テストごとのJest Mockモジュール

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_を使用します

20
Kanekotic

スパイをモックして、モックされたモジュールをインポートできます。テストでは、 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')
})
50

spyOnが最適でした。前の回答を参照してください:

https://stackoverflow.com/a/54361996/1708297

0

次のパターンを使用します。

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

説明:

テストスイートレベルで使用しようとしているクラスをモックし、各テストの前にモックがリセットされていることを確認します

0
Tal Joffe