Тестирование с помощью Jest + Enzyme API Не запускаются пробные вызовы - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть проблема, которую я не могу понять, и я надеялся, что кто-то может помочь мне с этим.

Это мой тест: state.messages - пустой массив и api.botReply вызывается 0 разкогда он находится в функции для запуска.

state.typing установлен в значение true, поэтому я знаю, что я запускаю функцию.

test('test to resolve data from botReply', done => {
    const wrapper = shallow(<Bot />);

    api.botReply = jest.fn(() =>
        Promise.resolve(wrapper.setState({ typing: false }))
    );

    wrapper.instance().sendReply();

    setImmediate(() => {
        wrapper.update();
        console.log(wrapper.state('typing'));
        console.log(wrapper.state('messages'));
        expect(api.botReply).toHaveBeenCalledTimes(1);
        done();
    });
});

И это функция, которая запускается:

 sendReply = () => {
    this.setState({ typing: true });
    api.botReply()
      .then(reply => {
        this.setState({ messages: [...this.state.messages, reply], typing: false });
      })
  };

1 Ответ

0 голосов
/ 15 февраля 2019

Сброс цепочек обещаний и использование случайных задержек может привести к таким состояниям гонки.

Поскольку обещание предоставляется в тестах, его следует объединить в цепочку для поддержания правильного потока управления.Не рекомендуется назначать шпионов Jest методами, поскольку они не будут очищены впоследствии.Обещание должно разрешаться с reply, а не с установленным состоянием.

Это должно быть что-то вроде:

test('test to resolve data from botReply', async () => {
    const wrapper = shallow(<Bot />);
    const promise = Promise.resolve('reply')'

    jest.spyOn(api, 'botReply').mockImplementation(() => promise);

    wrapper.instance().sendReply();
    expect(wrapper.state('typing')).toBe(true);
    await promise;
    expect(api.botReply).toHaveBeenCalledTimes(1);
    expect(wrapper.state('typing')).toBe(false);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...