小能豆

如何在每个测试中改变 jest mock 函数的返回值?

javascript

我的组件测试文件中有一个像这样的模拟模块

  jest.mock('../../../magic/index', () => ({
    navigationEnabled: () => true,
    guidanceEnabled: () => true
  }));

这些函数将在我的组件的渲染函数中被调用来隐藏和显示一些特定的功能。

我想要对这些模拟函数的返回值的不同组合进行快照。

假设我有一个像这样的测试用例

 it('RowListItem should not render navigation and guidance options', () => {
    const wrapper = shallow(
      <RowListItem type="regularList" {...props} />
    );
    expect(enzymeToJson(wrapper)).toMatchSnapshot();
  });

为了运行这个测试用例,我想将模拟模块函数的返回值false动态地更改为这样

jest.mock('../../../magic/index', () => ({
    navigationEnabled: () => false,
    guidanceEnabled: () => false
  }));

因为我已经导入RowListItem过一次组件,所以我的模拟模块不会再次重新导入。所以它不会改变。我该如何解决这个问题?


阅读 47

收藏
2024-06-05

共1个答案

小能豆

您可以模拟模块以便它返回间谍并将其导入到您的测试中:

import {navigationEnabled, guidanceEnabled} from '../../../magic/index'

jest.mock('../../../magic/index', () => ({
    navigationEnabled: jest.fn(),
    guidanceEnabled: jest.fn()
}));

然后你可以使用以下方法更改实际实现mockImplementation

navigationEnabled.mockImplementation(()=> true)
//or
navigationEnabled.mockReturnValueOnce(true);

在下一个测试中

navigationEnabled.mockImplementation(()=> false)
//or
navigationEnabled.mockReturnValueOnce(false);
2024-06-05