Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.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
Javascript 如何在jest中使用回调模拟反应导航函数_Javascript_React Native_Mocking_Jestjs_React Navigation - Fatal编程技术网

Javascript 如何在jest中使用回调模拟反应导航函数

Javascript 如何在jest中使用回调模拟反应导航函数,javascript,react-native,mocking,jestjs,react-navigation,Javascript,React Native,Mocking,Jestjs,React Navigation,我正在尝试使用jest测试我的功能组件: const MyComponent = props => { const myFunction = () => { const { navigation, onIndexChange } = props; navigation.navigate("Modal", { onGoBack: () => { onIndexChange(0);

我正在尝试使用jest测试我的功能组件:

const MyComponent = props => {

  const myFunction = () => {
      const { navigation, onIndexChange } = props;

      navigation.navigate("Modal", {
          onGoBack: () => {
              onIndexChange(0);
          }
      });
  };

  ...
}
现在在我的测试中,如果我运行

expect(navigation.navigate).toHaveBeenCalledTimes(1);
它完全通过了。但是我不知道如何模拟
导航
,这样我就可以用
来测试它,以便用
来调用它,基本上我想要这样的东西:

expect(navigation.navigate).toHaveBeenCalledWith("Modal", {onGoBack: onIndexChange(0)});
这就是我目前嘲笑它的方式:

const navigation = {
    navigate: jest.fn()
};
这就是我尝试使用TohavebeenCalled时得到的结果: 你的断言

expect(navigation.navigate).toHaveBeenCalledWith("Modal", {onGoBack: onIndexChange(0)});
表示您希望
navigation.navigate
作为第二个对象被调用为
onGoBack
,该对象的值为
onIndexChange
的值,调用时使用
0

但是在您的实现中,
onGoBack
的值是一个匿名函数

因此,如果您可以断言已使用具有函数的对象调用函数:

expect(navigation.navigate).toHaveBeenCalledWith("Modal", {
  onGoBack: expect.any(Function)
});
无论何时调用该函数,它都将调用给定的onIndexChange

describe('whenever the anonymous function is called', () => {
  let onGoBack;
  beforeAll(() => {
    const [firstCall] = navigation.navigate.mock.calls;
    [location, { onGoBack }] = firstCall;
    onGoBack()
  })

  it('should call onIndexChange', () => {
    expect(onIndexChange).toHaveBeenCalledWith(0);
  });
});
你的断言

expect(navigation.navigate).toHaveBeenCalledWith("Modal", {onGoBack: onIndexChange(0)});
表示您希望
navigation.navigate
作为第二个对象被调用为
onGoBack
,该对象的值为
onIndexChange
的值,调用时使用
0

但是在您的实现中,
onGoBack
的值是一个匿名函数

因此,如果您可以断言已使用具有函数的对象调用函数:

expect(navigation.navigate).toHaveBeenCalledWith("Modal", {
  onGoBack: expect.any(Function)
});
无论何时调用该函数,它都将调用给定的onIndexChange

describe('whenever the anonymous function is called', () => {
  let onGoBack;
  beforeAll(() => {
    const [firstCall] = navigation.navigate.mock.calls;
    [location, { onGoBack }] = firstCall;
    onGoBack()
  })

  it('should call onIndexChange', () => {
    expect(onIndexChange).toHaveBeenCalledWith(0);
  });
});

谢谢您的回复。我试过了,现在它说:-预期为:“onGoBack”:[函数mockConstructor],但收到了:“onGoBack”:[函数onGoBack],谢谢您的回复。我试过了,现在它说:-预期为:“onGoBack”:[函数mockConstructor],但收到了:“onGoBack”:[函数onGoBack],