我有一个函数getBookingStateObject
,可以调用另一个函数getBookingStateButtons
。反过来getBookingStateButtons
会调用另外两个函数linkButtons
和sendEventButtons
。
我正在尝试为上述场景编写测试。我的测试文件中有以下内容。
import {
getBookingStateButtons,
getBookingStateObject,
linkButtons,
sendEventButtons,
} from './bookingStates'
jest.mock('getBookingStateButtons', () => jest.fn())
jest.mock('linkButtons', () => jest.fn())
jest.mock('sendEventButtons', () => jest.fn())
it('calls getBookingStateButtons, linkButtons, sendEventButtons', () => {
getBookingStateObject({ aasm_state: 'created' }, '123')
expect(getBookingStateButtons).toHaveBeenCalledWith({
bookingId: '123',
events: [{ event: 'mark_requested', type: 'secondary' }],
links: [{ to: 'edit' }],
})
expect(linkButtons).toHaveBeenCalledWith({
to: 'edit',
type: 'secondary',
})
expect(sendEventButtons).toHaveBeenCalledWith({
event: 'mark_requested',
type: 'secondary',
})
})
当我运行测试时,我收到以下错误:
Cannot find module 'getBookingStateButtons' from 'bookingStates.spec.tsx'
我是开玩笑的新手,我做错了什么?
答案 0 :(得分:5)
问题是你试图模拟不是jest.mock
所做的模块部分。它的作用是模拟整个模块,在大多数情况下你想要什么。所以在你的情况下
jest.mock('getBookingStateButtons', () => jest.fn())
尝试模拟一个名为getBookingStateButtons
的npm模块,所以要安装的东西就像这样
import getBookingStateButtons from 'getBookingStateButtons'
你应该把一个模块想象成一个黑盒子,你可以放入东西并获取一些东西。你不能只改变黑匣子的部分。由于我不知道'./bookingStates'
是什么,我认为它会产生一些副作用,也就是与其他导入模块的某些交互。这些是你要模拟并测试它们在哪里调用正确的参数,而不是'./bookingStates'
模块的内部。