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
相关产品推荐
相关产品推荐

