如何在每个测试中更改 jest mock 函数 return 值?
how to change jest mock function return value in each test?
我的组件测试文件中有一个这样的模拟模块
jest.mock('../../../magic/index', () => ({
navigationEnabled: () => true,
guidanceEnabled: () => true
}));
这些函数将在我的组件的渲染函数中调用,以隐藏和显示某些特定功能。
我想对这些模拟函数的 return 值的不同组合拍摄快照。
假设我有这样的测试用例
it('RowListItem should not render navigation and guidance options', () => {
const wrapper = shallow(
<RowListItem type="regularList" {...props} />
);
expect(enzymeToJson(wrapper)).toMatchSnapshot();
});
到运行这个测试用例我想像这样动态地将模拟模块函数return值更改为false
jest.mock('../../../magic/index', () => ({
navigationEnabled: () => false,
guidanceEnabled: () => false
}));
因为我已经导入了一次 RowListItem
组件,所以我的模拟模块不会再次导入。所以它不会改变。我该如何解决这个问题?
您可以模拟该模块,使其 returns 侦察并将其导入到您的测试中:
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
我很难让接受的答案起作用 - 当我试图调用 mockReturnValueOnce
时,我的 navigationEnabled
和 guidanceEnabled
的等价物是未定义的。
这是我必须做的:
在../../../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);
});
我的组件测试文件中有一个这样的模拟模块
jest.mock('../../../magic/index', () => ({
navigationEnabled: () => true,
guidanceEnabled: () => true
}));
这些函数将在我的组件的渲染函数中调用,以隐藏和显示某些特定功能。
我想对这些模拟函数的 return 值的不同组合拍摄快照。
假设我有这样的测试用例
it('RowListItem should not render navigation and guidance options', () => {
const wrapper = shallow(
<RowListItem type="regularList" {...props} />
);
expect(enzymeToJson(wrapper)).toMatchSnapshot();
});
到运行这个测试用例我想像这样动态地将模拟模块函数return值更改为false
jest.mock('../../../magic/index', () => ({
navigationEnabled: () => false,
guidanceEnabled: () => false
}));
因为我已经导入了一次 RowListItem
组件,所以我的模拟模块不会再次导入。所以它不会改变。我该如何解决这个问题?
您可以模拟该模块,使其 returns 侦察并将其导入到您的测试中:
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
我很难让接受的答案起作用 - 当我试图调用 mockReturnValueOnce
时,我的 navigationEnabled
和 guidanceEnabled
的等价物是未定义的。
这是我必须做的:
在../../../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);
});