如何在每个测试中更改 jest 模拟函数返回值?

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

  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组件,所以我的模拟模块不会再次导入。所以它不会改变。我该怎么解决这个问题?

166544 次浏览

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

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);

你想做的是

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


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


describe('test suite', () => {
it('every test', () => {
navigationEnabled.mockReturnValueOnce(value);
guidanceEnabled.mockReturnValueOnce(value);
});
});

您可以在这里查看更多关于这些函数的信息 = > https://facebook.github.io/jest/docs/mock-functions.html#mock-return-values

我很难得到公认的工作答案-我的等价物 navigationEnabledguidanceEnabled是未定义的,当我试图调用 mockReturnValueOnce对他们。

我必须这么做:

../../../magic/__mocks__/index.js:

export const navigationEnabled = jest.fn();
export const guidanceEnabled = jest.fn();

在我的 index.test.js文件中:

jest.mock('../../../magic/index');
import { navigationEnabled, guidanceEnabled } from '../../../magic/index';
import { functionThatReturnsValueOfNavigationEnabled } from 'moduleToTest';


it('is able to mock', () => {
navigationEnabled.mockReturnValueOnce(true);
guidanceEnabled.mockReturnValueOnce(true);
expect(functionThatReturnsValueOfNavigationEnabled()).toBe(true);
});