如何使用chai或chai-as-promised测试异步函数抛出的错误?
原有写法失效的原因
普通的to.throw断言仅支持捕获同步函数的抛出错误,async函数返回的是Promise实例,内部抛出的错误会转为Promise的reject状态,不会被同步执行的to.throw捕获。
正确实现方式
根据你使用的测试工具,有几种常用写法:
1. Jest 框架写法
直接调用rejects属性断言即可:
it("测试函数是否抛出预期错误", async function () { await expect(foo()).rejects.toThrow(Error); });
2. Chai + chai-as-promised 写法
引入chai-as-promised插件后使用eventually断言:
it("测试函数是否抛出预期错误", async function () { await expect(foo()).to.eventually.be.rejectedWith(Error); });
3. 通用兼容写法(无需额外插件)
手动用try catch捕获异步错误后断言:
it("测试函数是否抛出预期错误", async function () { try { await foo(); // 执行到此处说明未抛出错误,直接标记测试失败 expect.fail("函数未抛出预期的Error错误"); } catch (err) { expect(err).instanceOf(Error); } });
注意所有写法都必须加await等待异步逻辑执行完成,否则断言会在Promise状态变更前就结束,导致测试不准。
内容的提问来源于stack exchange,提问作者4allmyqueries
相关产品推荐
相关产品推荐

