Разве await function()
не должен разрешить все обещания, прежде чем перейти к следующей линии ожидания?
Да, await
будет ожидать возвращенного Promise
, прежде чем продолжить.
Вот простой рабочий пример:
const function1 = jest.fn().mockResolvedValue();
const function2 = jest.fn().mockResolvedValue();
const function3 = jest.fn().mockResolvedValue();
const func = async () => {
await function1();
await function2();
await function3();
}
it('calls function3', async () => {
await func();
expect(function3).toHaveBeenCalled(); // Success!
})
Если await
не ожидает так долго, как ожидалось, то в какой-то момент цепь Promise
, вероятно, будет разорвана.
Вот пример разорванной Promise
цепочки:
const function1 = jest.fn().mockResolvedValue();
const function2 = jest.fn().mockResolvedValue();
const function3 = jest.fn().mockResolvedValue();
const func = async () => {
await function1();
await function2();
await function3();
}
const func2 = async () => {
func(); // <= breaks the Promise chain
}
it('calls function3', async () => {
await func2();
expect(function3).toHaveBeenCalled(); // <= FAILS
})
Вызов await
несколько раз поставит в очередь оставшуюся часть тестовой функции в конце очереди PromiseJobs
несколько раз, что может дать ожидающим Promise
обратным вызовам шанс на запуск ...
... поэтому пройденный выше тест пройдёт, если он будет изменён на этот:
it('calls function3', async () => {
await await await await func2(); // <= multiple await calls
expect(function3).toHaveBeenCalled(); // Success...only because of multiple await calls
})
... но реальное решение состоит в том, чтобы найти и исправить место, где нарушена цепочка Promise
:
const func2 = async () => {
await func(); // <= calling await on func fixes the Promise chain
}
it('calls function3', async () => {
await func2();
expect(function3).toHaveBeenCalled(); // Success!
})