Reactjs 如何在每次测试中更改jest模拟函数返回值?
在我的组件测试文件中有这样一个模拟模块Reactjs 如何在每次测试中更改jest模拟函数返回值?,reactjs,react-native,jestjs,enzyme,Reactjs,React Native,Jestjs,Enzyme,在我的组件测试文件中有这样一个模拟模块 jest.mock('../../../magic/index', () => ({ navigationEnabled: () => true, guidanceEnabled: () => true })); 这些函数将在我的组件的render函数中调用,以隐藏和显示某些特定功能 我想对这些模拟函数的返回值的不同组合进行快照 假设我有一个这样的测试用例 it('RowListItem should not
jest.mock('../../../magic/index', () => ({
navigationEnabled: () => true,
guidanceEnabled: () => true
}));
这些函数将在我的组件的render函数中调用,以隐藏和显示某些特定功能
我想对这些模拟函数的返回值的不同组合进行快照
假设我有一个这样的测试用例
it('RowListItem should not render navigation and guidance options', () => {
const wrapper = shallow(
<RowListItem type="regularList" {...props} />
);
expect(enzymeToJson(wrapper)).toMatchSnapshot();
});
因为我已经导入了
RowListItem
组件一次,所以我的模拟模块不会再次导入。所以它不会改变。如何解决此问题?您可以模拟模块,使其返回间谍并将其导入测试:
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);
});
});
你可以在这里查看更多关于这些函数的信息=>我很难得到公认的答案,当我试图调用
mockReturnValueOnce
时,我的navigationEnabled
和guidanceEnabled
的等价项没有定义
以下是我必须做的:
在。/../../magic/\uuuuu mocks\uuuu/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
。@Sylvain在ES6导入之前不能/将不会调用任何东西,它们被静态强制为第一个。@Olayeoluwapelumi您可以在需要之前键入它,但在ES6导入之后才会执行它,因为它们被静态地强制为第一个。相关引用:“但通常在模块使用模拟之前,您需要指示Jest使用它。因此,Jest将自动将Jest.mock调用提升到模块顶部(在任何导入之前)。”From:这里有一个教程详细介绍了这项技术-这不适用于typescript,您将得到:属性“mockReturnValueOnce”在类型“()=>string”上不存在。对于TS,您需要执行(mockedFn作为jest.Mock)。mockReturnValueOnce
如果使用ts jest
,则mocked(mockedFn)
包装器是相同事物的语法糖。
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);
});