Chai测试带参数async箭头函数无法捕获抛出异常该如何解决
问题解决方法
核心原因
- 你当前测试的
inviteDomainOwner是async异步函数,普通Chai的to.throw断言仅支持捕获同步函数的同步抛出异常,async函数抛出的错误会转换为Promise的拒因,不会同步抛出,因此to.throw无法捕获到对应异常,返回实际值为undefined。 - 原有断言代码的括号位置存在语法错误:
to.throw被绑定到inviteDomainOwner()调用的返回值上,而非传入expect的测试函数。
注意:你业务代码中的try/catch逻辑不需要调整,抛出异常的逻辑本身是符合预期的,问题全部来源于测试用例的断言写法错误。
修复方案
方案1:使用chai-as-promised插件(推荐,Chai官方配套异步断言工具)
- 先安装依赖:
npm install chai-as-promised --save-dev - 注册插件到Chai:
const chai = require('chai'); const chaiAsPromised = require('chai-as-promised'); chai.use(chaiAsPromised); const expect = chai.expect;
- 调整测试用例代码:
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
相关产品推荐
相关产品推荐

