Я пишу асинхронный тест, который ожидает, что асинхронная функция выдаст следующее:

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.

Sean

Ответов: 5

Ответы (5)

Вы можете протестировать свою асинхронную функцию следующим образом:

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

Строка «Я должен потерпеть неудачу» будет соответствовать любой части выданной ошибки.

Я хотел бы просто добавить к этому и сказать, что функция, которую вы тестируете, должна генерировать фактический объект Error throw new Error (...). Кажется, что Jest не распознает, если вы просто бросите выражение вроде throw 'Произошла ошибка!'.

Я тестировал облачные функции Firebase, и вот что у меня получилось:

test("It should test async on failing cloud functions calls", async () => {
    await expect(async ()=> {
        await failingCloudFunction(params)
    })
    .rejects
    .toThrow("Invalid type"); // This is the value for my specific error
  });

Это построено на основе ответа Лисандро.

await expect(async () => { 
    await someAsyncFunction(someParams); 
}).rejects.toThrowError("Some error message");

We must wrap the code in a function to catch the error. Here we are expecting the Error message thrown from someAsyncFunction should be equal to "Some error message". We can call the exception handler also

await expect(async () => { 
    await someAsyncFunction(someParams); 
}).rejects.toThrowError(new InvalidArgumentError("Some error message"));

Подробнее https://jestjs.io/docs/expect#tothrowerror

Пользовательский класс ошибки

Использование rejects.toThrow вам не подойдет. Вместо этого вы можете комбинировать метод rejects с сопоставлением toBeInstanceOf, чтобы соответствовать выданной настраиваемой ошибке.

Пример

it ("должен тестировать асинхронные ошибки", async () => {
  ждать ожидать (asyncFunctionWithCustomError ()). rejects.toBeInstanceOf (
    CustomError
  )
})

или


it ("должен тестировать асинхронные ошибки", async () => {
  ждать ожидать (async () => {
    ожидание asyncFunctionWithCustomError ()
  }). rejects.toBeInstanceOf (CustomError)
})

2022 WebDevInsider