Тест Jest: setTimeout не запускается в асинхронном тесте - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь понять, как работает асинхронное тестирование в Jest.

То, что я пытаюсь сделать, похоже на пример из документации Jest.Это работает нормально ..

function doAsync(c) {
  c(true)
}

test('doAsync calls both callbacks', () => {

  expect.assertions(2);

  function callback1(data) {
    expect(data).toBeTruthy();
  }

  function callback2(data) {
    expect(data).toBeTruthy();
  }

  doAsync(callback1);
  doAsync(callback2);
});

Но я хочу отложить вызовы обратного вызова, поэтому я попытался это сделать ....

 function doAsync(c) {
    setTimeout(() => {
      console.log('timeout fired')
      c(true)
    }, 1000)
  }

, но проверка завершается неудачно с сообщением Expected two assertions to be called but received zero assertion calls..

В журнале не отображается сообщение «Тайм-аут сработал».

Пожалуйста, кто-нибудь может объяснить, почему он не работает?

1 Ответ

0 голосов
/ 04 октября 2018

Вам нужно использовать макеты тайнов jest https://jestjs.io/docs/en/timer-mocks

Сначала вы говорите jest использовать таймеры фиктивного режима, а затем запускаете таймеры в своем тесте.

Это будет выглядеть примерно так:

function doAsync(c) {
  setTimeout(() => {
      c(true)
    }, 1000)
}

jest.useFakeTimers()

test('doAsync calls both callbacks', () => {

  expect.assertions(2);

  function callback1(data) {
    expect(data).toBeTruthy();
  }

  function callback2(data) {
    expect(data).toBeTruthy();
  }

  doAsync(callback1);
  doAsync(callback2);

  jest.runAllTimers(); // or jest.advanceTimersByTime(1000)
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...