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

使用chai-as-promised测试Promise拒绝时reason.code断言失败问题

解决chai-as-promised断言Promise拒绝时的属性匹配问题

我来帮你分析下问题所在,以及怎么修复这个断言:

问题根源

你当前的断言有两个核心问题:

  1. 重复使用eventually:在be.rejected之后,链式调用的断言已经处于Promise的上下文之中,不需要再额外添加eventually,重复使用会导致断言的目标对象偏离预期。
  2. 错误的对象匹配逻辑:你期望reason是一个普通对象{code: 'ER_DUP_ENTRY'},但实际上reason是一个Error实例——虽然它包含code属性,但Error对象本身还有message、stack等固有属性,用deep.property直接匹配整个对象会因为这些额外属性而失败。

正确的断言写法

你需要调整断言逻辑,直接校验reason下的code属性值,而不是匹配整个reason对象。修改后的代码如下:

expect(insertTable()).to.eventually.be.rejected
  .and.have.deep.property('reason.code', 'ER_DUP_ENTRY')
  .notify(done);

如果你想更清晰地拆分断言步骤,也可以用这种写法:

return expect(insertTable()).to.be.rejected
  .then(err => {
    expect(err.reason.code).to.equal('ER_DUP_ENTRY');
  })
  .notify(done);

为什么之前的console.log看起来正常?

你用console.log(err.reason.code)得到ER_DUP_ENTRY,是因为你只打印了code属性的值,没有输出整个reason对象。当你打印完整的reason时,会看到它是一个Error实例,而非你断言的普通对象,这就是深度匹配失败的关键原因。

内容的提问来源于stack exchange,提问作者Jordan.J.D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:57:36