我有以下Jest / Enzyme测试:
const mockCheckMyFunctionality = jest.fn();
jest.mock('../modules/MyFunctionality', () => ({
checkMyFunctionality: mockCheckMyFunctionality
}));
const wrapper = shallow(
<App initialProps={mockInitialProps} />
);
expect(mockCheckMyFunctionality).toHaveBeenCalledTimes(1);
这将失败TypeError: Cannot read property 'onNextTick' of undefined
。错误消息本身不相关,但它只是显示真实MyFunctionality.checkMyFunctionality
而不是mockCheckMyFunctionality
。
但是,如果我更换:
jest.mock('../modules/MyFunctionality', () => ({
checkMyFunctionality: mockCheckMyFunctionality
}));
使用:
MyFunctionality.checkMyFunctionality = mockCheckMyFunctionality;
测试将通过,表明实际调用了mockCheckMyFunctionality
。但是,这很麻烦,并且无法通过EsLint检查。
我正在测试的方法就是:
setupMyFunctionality() {
checkMyFunctionality(this.props.something);
}
如何修改模拟,使其在App
内可见?
重新分配似乎有效但嘲笑却没有。
答案 0 :(得分:0)
也许您忘了为MyFuncionality
模块创建手动模拟
与模拟模块的documentation一样:
通过在
__mocks__/
中编写模块来定义手动模拟 紧邻模块的子目录。例如,要在user
目录中模拟名为models
的模块,请创建一个名为user.js
的文件并将其放在models/__mocks__
目录中。
...
当给定模块存在手动模拟时,Jest的模块系统将在显式调用jest.mock('moduleName')
时使用该模块。
如果是这种情况,您可以在__mocks__
文件旁边创建一个名为MyFunctionality
的文件夹,然后在该文件夹中创建一个MyFunctionality
文件,其中包含模拟实现,如代码中所示snippet,并在测试之前通过调用jest.mock('../modules/MyFunctionality')
显式调用mock。
我在项目中开始使用的另一个解决方案是将依赖项作为props传递给组件。要实现这一点,您可以更改App
组件并将MyFunctionality
作为道具传递,因此在上面的测试中,您只需要传递作为道具实现的模拟,从而避免创建{{1}的必要性}文件夹来完成测试。