Ожидайте шутливого теста, но значение не имеет значения - PullRequest
0 голосов
/ 05 февраля 2019

Допустим, у меня есть следующий fn, который я хочу проверить:

const foo = async () => {}

Конечно, это решает проблему, но как мне это проверить с помощью Jest?

it('resolves', async () => {
  expect(await foo()).???
});

Всепримеры, которые я могу найти, требуют значений, например expect(await foo()).resolves.toBe(42)

1 Ответ

0 голосов
/ 06 февраля 2019

Если вы знаете, что 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.

...