Чи можете ви написати асинхронні тести, які очікують на Throw?


88

Я пишу тест на асинхронізацію, який очікує, що функція асинхронізації буде виглядати так:

it("expects to have failed", async () => {
  let getBadResults = async () => {
    await failingAsyncTest()
  }
  expect(await getBadResults()).toThrow()
})

Але жарт просто не вдається замість того, щоб пройти тест:

 FAIL  src/failing-test.spec.js
  ● expects to have failed

    Failed: I should fail!

Якщо я переписую тест, виглядає так:

expect(async () => {
  await failingAsyncTest()
}).toThrow()

Я отримую цю помилку замість проходження тесту:

expect(function).toThrow(undefined)

Expected the function to throw an error.
But it didn't throw anything.

Ви це вирішили?
luislhl

1
Ні, я просто пропустив написання цього тесту.
Шон,

Все ще не везе? У мене таке ж питання
Roco CTZ

Відповіді:


172

Ви можете протестувати свою функцію асинхронізації таким чином:

it('should test async errors', async () =>  {        
    await expect(failingAsyncTest())
    .rejects
    .toThrow('I should fail');
});

Рядок "Мені не вдасться" відповідатиме будь-якій частині викинутої помилки.


11
Зараз це задокументовано у facebook.github.io/jest/docs/en/expect.html#rejects
0x24a537r9

2
Насправді має проблеми, задокументований приклад не вдається. github.com/facebook/jest/issues/3601 має обхідні шляхи, зокремаawait expect(failingAsyncTest()).rejects.toHaveProperty('message', 'I should fail');
MrYellow

@Lisandro Цей код не працює. Так, модульний тест проходить, але не тому, failingAsyncTestщо виникла правильна помилка. Це більш очевидно, якщо ви зміните реалізацію, failingAsyncTestщоб викинути неправильну помилку замість правильної. (з використанням Jest 23.6)
Том

2
@Tom Рішення ніколи не претендує на відповідність типу помилки . У ньому чітко зазначено, що рядок відповідає повідомленню про помилку . Це чудово працює. Найкраще.
Лісандро

Більш очевидно, що toThrow тестує для підрядка, якщо змінити його параметр на RegExp:await expect(failingAsyncTest()).rejects.toThrow(/fail/);
Ден Даскалеску

17

Я хотів би просто додати до цього і сказати, що функція, яку ви тестуєте, повинна створювати фактичний об'єкт Помилки throw new Error(...). Джест, схоже, не впізнає, якщо ви просто накинете вираз типу throw 'An error occurred!'.


Ну, ви просто врятували мені багато часу.
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.