如何更改模拟导入的行为?

新手上路,请多包涵

我对 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

原文由 Kanekotic 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 339
2 个回答

您可以使用间谍进行模拟并导入模拟模块。在您的测试中,您使用 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')
})

原文由 Andreas Köberle 发布,翻译遵循 CC BY-SA 4.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)
  })
})

解释:

您模拟您尝试在测试套件级别使用的类,确保在每次测试之前重置模拟,并且对于您使用 mockResolveValue 的每个测试来描述返回模拟时将返回的内容

原文由 Tal Joffe 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题