您可以编写预期会抛出的异步测试吗?


86

我正在编写一个异步测试,期望异步函数像这样抛出:

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

Answers:


166

您可以像这样测试异步功能:

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

“我应该失败”字符串将与抛出的错误的任何部分匹配。



2
实际有问题,记录的示例失败。github.com/facebook/jest/issues/3601的解决方法包括await expect(failingAsyncTest()).rejects.toHaveProperty('message', 'I should fail');
MrYellow

@Lisandro此代码无效。是的,单元测试通过了,但是不是因为failingAsyncTest抛出了正确的错误。如果更改实现failingAsyncTest以引发错误的错误而不是正确的错误,则更加明显。(使用Jest 23.6)
汤姆(Tom

2
@Tom解决方案从不声称与错误Type相匹配。它清楚地指出字符串与错误Message匹配。它工作得很好。最好。
利桑德罗(Lisandro)'18年

更明显的是,如果将子字符串的参数更改为RegExp,则toThrow将对其进行测试:await expect(failingAsyncTest()).rejects.toThrow(/fail/);
Dan Dascalescu,

16

我想补充一点,说您正在测试的函数必须抛出一个实际的Error对象throw new Error(...)。杰斯特(Jest)似乎无法识别你是否抛出像这样的表达式throw 'An error occurred!'


好吧,您为我节省了很多时间。
尼克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.