Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何在每次测试中更改jest模拟函数返回值?_Reactjs_React Native_Jestjs_Enzyme - Fatal编程技术网

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