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

chai-as-promised中should.eventually.equal断言不生效问题排查

解决chai-as-promised断言未通过的问题

这个问题的核心是你没有告诉测试框架Mocha要等待异步断言完成。当你使用should.eventually.equal时,chai-as-promised会返回一个Promise,但你的测试函数是同步执行的——Mocha默认会在测试函数执行完毕后立刻结束测试,根本不会等这个Promise的结果,导致断言还没真正执行就被判定为失败(或者直接跳过了断言的验证)。

修正方案有三种,选你觉得最顺手的就行:

1. 返回断言的Promise给Mocha

让Mocha自动等待这个Promise完成,这是最简洁的方式之一:

chai.use(sinonChai);
chai.use(chaiAsPromised);
const { expect } = chai;
const should = chai.should();
describe('#Test', () => {
  it('test', () => {
    // 把断言返回的Promise return出去,Mocha会等待它resolve/reject
    return expect(simple.test(1)).should.eventually.equal(1);
  });
});

2. 使用async/await语法(最直观)

利用ES6的async/await让测试函数变成异步,直接等待断言完成:

chai.use(sinonChai);
chai.use(chaiAsPromised);
const { expect } = chai;
const should = chai.should();
describe('#Test', () => {
  // 给it的回调加上async关键字
  it('test', async () => {
    // 用await等待断言的Promise执行完成
    await expect(simple.test(1)).should.eventually.equal(1);
  });
});

3. 使用done回调(传统异步测试方式)

如果习惯了回调风格,可以用notify(done)来通知Mocha测试完成:

chai.use(sinonChai);
chai.use(chaiAsPromised);
const { expect } = chai;
const should = chai.should();
describe('#Test', () => {
  // 接收done参数
  it('test', (done) => {
    // 断言完成后调用done通知Mocha
    expect(simple.test(1)).should.eventually.equal(1).notify(done);
  });
});

额外说明

你定义的simple.test是async函数,这没问题——async函数无论返回什么值,都会自动包装成Promise,所以chai-as-promised能正确识别它。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:31:33