Если вы знаете, что foo()
всегда разрешается в значение, то вы можете использовать .toBeDefined()
:
it('resolves', async () => {
await expect(foo()).resolves.toBeDefined();
});
Это не работает, если foo()
завершается с использованием return undefined
или return
(без значения) или он вообще не использует return
.
В этом случае вы не можете использовать .resolves
, но вы можете просто вернуть Promise
, возвращенный foo()
, и Jest позаботитсяиз остальных:
it('resolves', () => {
return foo();
});
Что не так с вашим кодом
Вы пробовали:
expect(await foo()).resolves.toBe(42)
Это не сработает, потому что результат await foo()
- это не Promise
, но разрешенное значение Promise
, возвращаемое foo()
(при условии, что оно разрешается).
.resolves.toBe()
ожидает Promise
, Жест жалуется и тест не пройден.
Когда await
перед expect()
, foo()
возвращает Promise
, expect()
оборачивает его в объект, чей .resolves.toBe...()
возвращает другой Promise
и await
ожидает его.
Общее правило: если вы введете await
в вызове к expect()
, вы не сможете использовать .resolves
или .rejects
, потому что значение, которое получает expect()
, не является Promise
.Чтобы использовать .resolves
или .rejects
, ключевое слово await
должно стоять перед вызовом expect()
.В качестве альтернативы вы можете return
Promise
вместо await
-ing для него.
Подробнее о .resolves
и .rejects
.