Помните, что при тестировании асинхронного кода необходимо использовать разные стратегии, как указано в документации .
Я столкнулся с множеством проблем, прежде чем пытаться протестировать мой асинхронный код, большинство проблем заключалось в том, что тест утверждал ожидаемое поведение до того, как разрешенное обещание могло быть обработано, и утверждение нужно было сделать вследующий тик цикла событий , которого я на практике достигаю, помещая утверждение в setImmediate
, что также может быть достигнуто с помощью setTimeout
.
Из документации jest вы можете изменить свой тест и передать обратный вызов done
, отправить запускающее действие как обычно, но поместить утверждение в обратный вызов setTimeout
с тайм-аутом в 1 мс, чтобы просторешенное обещание будет обработано, затем будет вызван обратный вызов, и он подтвердит желаемое состояние.
Можно использовать другие стратегии, например async/await
, или вместо setTimeout
можно разрешить пустое обещание и поместить утверждение в обратный вызов then
.Просто имейте в виду, что если в тестируемом потоке существует больше Обещаний, потребуется больше тиков в цикле событий до тех пор, пока не будет достигнут желаемый результат.
РЕДАКТИРОВАТЬ: Реализация:
// test
it('produces the photo model', (done) => {
...
// dispatch epic triggering action
store.dispatch(...);
// assertion
setImmediate(() => {
expect(store.getActions()).toEqual([
...
]);
done();
});