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

Chai测试带参数async箭头函数无法捕获抛出异常该如何解决

问题解决方法

核心原因

  • 你当前测试的inviteDomainOwner是async异步函数,普通Chai的to.throw断言仅支持捕获同步函数的同步抛出异常,async函数抛出的错误会转换为Promise的拒因,不会同步抛出,因此to.throw无法捕获到对应异常,返回实际值为undefined。
  • 原有断言代码的括号位置存在语法错误:to.throw被绑定到inviteDomainOwner()调用的返回值上,而非传入expect的测试函数。

注意:你业务代码中的try/catch逻辑不需要调整,抛出异常的逻辑本身是符合预期的,问题全部来源于测试用例的断言写法错误。

修复方案

方案1:使用chai-as-promised插件(推荐,Chai官方配套异步断言工具)

  1. 先安装依赖:
    npm install chai-as-promised --save-dev
  2. 注册插件到Chai:
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
const expect = chai.expect;
  1. 调整测试用例代码:
it('invite domain owner', async function() {
    const {inviteDomainOwner} = createInviteDomainOwner();
    // 直接传入Promise对象,使用rejectedWith断言异步抛出的异常
    await expect(inviteDomainOwner({
        emailAddress: 'abc123abc@test.com',
        firstName: 'John',
        lastName: 'Doe',
        domainId: '1111-1111-1111-1111'
    })).to.be.rejectedWith(InvalidInviteException, 'This is not a valid invite.');
});

方案2:手动捕获异常断言(无需额外依赖)

如果你不想引入新的依赖,可以手动await执行函数并捕获异常后再做断言:

it('invite domain owner', async function() {
    const {inviteDomainOwner} = createInviteDomainOwner();
    let actualError = null;
    try {
        await inviteDomainOwner({
            emailAddress: 'abc123abc@test.com',
            firstName: 'John',
            lastName: 'Doe',
            domainId: '1111-1111-1111-1111'
        });
    } catch (e) {
        actualError = e;
    }
    expect(actualError).to.be.an.instanceOf(InvalidInviteException);
    expect(actualError.message).to.equal('This is not a valid invite.');
});

内容的提问来源于stack exchange,提问作者user1790300

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:57:01