Как смоделировать навигацию навигационной функции с помощью обратного вызова в шутку - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь проверить свой функциональный компонент, используя jest:

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 голосов
/ 12 октября 2019

Ваше утверждение

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

рабочий пример (без React)

...