Issue
Как уже отмечалось, expect
завершается ошибкой до того, как обратные вызовы Promise
имеют шанс на запуск.
Решение
Дайте Promise
обратным вызовам aшанс запустить перед вызовом expect
.
Идеальным решением, конечно, является возврат Promise
из функции и await
ее напрямую.
Для ситуаций, когда этоневозможно, вы можете разрешить выполнение обратных вызовов Promise
, сделав тестовую функцию async
и вызвав await
для разрешенного Promise
.
Это, по существу, ставит в очередь оставшуюся часть теста в конце PromiseJobs
очередь за Promise
обратными вызовами.
Для случаев, когда Promise
обратные вызовы ставят в очередь дополнительные Promise
обратные вызовы, вы можете связать любое количество then()
вызовов с разрешеннымиPromise
для постановки в очередь оставшейся части теста за этими дополнительными обратными вызовами.
Вот рабочий пример:
const errorHandler = jest.fn();
const promiseFunc = () => Promise.reject();
const toBeTestedFunc = () => {
const promise = promiseFunc()
.then(() => { })
.catch((error) => { errorHandler() });
}
test('errorHandler called', async () => { // make the test function async
toBeTestedFunc();
await Promise.resolve().then(); // allow the callbacks queued in PromiseJobs to run
expect(errorHandler).toBeCalled(); // SUCCESS
});