You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:09:03