如何在玩笑中模拟带有回调的导航导航功能

时间:2019-10-12 04:38:16

标签: javascript react-native mocking jestjs react-navigation

我正在尝试使用玩笑来测试我的功能组件:

const MyComponent = props => {

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

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

  ...
}

现在我可以跑步了吗

expect(navigation.navigate).toHaveBeenCalledTimes(1);

它完美地过去了。但是我不知道如何模拟navigate以便可以用toHaveBeenCalledWith对其进行测试,基本上我想要这样的东西:

expect(navigation.navigate).toHaveBeenCalledWith("Modal", {onGoBack: onIndexChange(0)});

这是我目前嘲笑的方式:

const navigation = {
    navigate: jest.fn()
};

,这是我尝试使用toHaveBeenCalledWith时得到的: enter image description here

1 个答案:

答案 0 :(得分: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);
  });
});

working example (without React)