模拟不起作用,而重新分配确实如此

时间:2018-01-26 19:44:29

标签: javascript reactjs react-native enzyme jest

我有以下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内可见?

重新分配似乎有效但嘲笑却没有。

1 个答案:

答案 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}的必要性}文件夹来完成测试。