Тестирование асинхронного кода в Jest: done () не вызывается должным образом - PullRequest
0 голосов
/ 02 октября 2018

Вот набор тестов, написанный на Jest (v20.0.4).
Первые 3 теста - это ожидаемое поведение, мой вопрос связан с Test4.

test('Test1: the list should contain 7', () => {
  const data = [1, 2, 7, 9];
  expect(data).toContain(7);
});
// > Passes as expected
test('Test2: the list should contain 7', () => {
  const data = [1, 2, 7, 9];
  expect(data).toContain(8);
});
// > Fails as expected; Expected array: [1, 2, 7, 9] To contain value: 8
test('Test3: the list should contain 7', (done) => {
  function callback(data) {
    expect(data).toContain(7);
    done();
  }
  setTimeout(() => {
    callback([1, 2, 7, 9]);
  }, 500);
});
// > Passes as expected
test('Test4: the list should contain 7', (done) => {
  function callback(data) {
    expect(data).toContain(8);
    done();
  }
  setTimeout(() => {
    callback([1, 2, 7, 9]);
  }, 500);
});
// > Fails with Error "Timeout - Async callback was not invoked within timeout specified"

Вот мой вопрос:

В Test4, done() вызывается сразу после оператора expect.
Так что, даже если оператор ожидаемого не проходит, я догадался, что он должен потерпеть неудачу сошибка, аналогичная Test2: (Expected array: [1, 2, 7, 9] To contain value: 8)
Однако она завершается с ошибкой тайм-аута, как показано выше, которая предполагает, что done() никогда не вызывается.
Почему?Я не понимаю!

Может кто-нибудь, пожалуйста, помогите мне с этим поведением.Я сканировал через документы , но не смог найти ничего, связанного с этим.

Заранее спасибо!

1 Ответ

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

Я обнаружил, что setTimeout и Джест не работают, как можно подумать.Но есть хороший способ справиться с этим:

  • В начале вашего теста вы можете указать Jest использовать fakeTimers: jest.useFakeTimers();

  • Когда вам требуется выполнить обратный вызов, вы можете запустить его с помощью jest.runAllTimers();

https://jestjs.io/docs/en/timer-mocks.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...