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

时间:2017-08-18 13:52:02

标签: reactjs react-native jestjs enzyme

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

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

3 个答案:

答案 0 :(得分:41)

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

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

答案 1 :(得分:6)

你想做的是

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

您可以在此处查看有关这些功能的更多信息=&gt; https://facebook.github.io/jest/docs/mock-functions.html#mock-return-values

答案 2 :(得分:0)

我很难获得公认的工作答案-当我尝试在其上调用navigationEnabled时,我的guidanceEnabledmockReturnValueOnce的等价内容未定义。

这就是我要做的:

../../../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);
});