Jest测试未按预期失败:异步Promise场景下断言不生效问题
问题根因
你的测试用例误判为通过的核心是测试框架没有等待异步断言执行就提前结束了用例,具体存在两处错误:
- 错误地将
done回调传给了describe方法:describe仅用于测试用例分组,本身不支持异步回调的done参数,只有单个测试用例的it方法才支持异步done回调。 it块没有声明为异步模式:你没有给it的回调传入done,也没有返回Promise,测试框架执行完monitor.ready().then(...)这行同步代码后,就直接标记该用例执行通过,根本没有等待then回调里的断言逻辑执行,所以断言错误永远不会被触发。
修复方案
方案1:使用done回调(需补充异常捕获)
把done回调传给it方法,同时新增catch捕获Promise链中所有错误(包括断言抛出的错误),并将错误传给done通知框架测试结果:
const list = ['A', 'B', 'C']; // describe不要传done参数 describe('check array', () => { // done要传给it的回调 it('should not contain D', (done) => { const monitor = new Monitor(); monitor.ready().then(() => { expect(list.indexOf('D')).toEqual(1); done(); }).catch(err => { // 捕获所有异常包括断言错误,传给done让框架识别测试失败 done(err); }); }); });
方案2:使用async/await(更简洁,推荐)
直接将it的回调声明为async函数,测试框架会自动等待异步逻辑执行完成,并且自动捕获所有断言错误,不需要手动处理done和异常捕获:
const list = ['A', 'B', 'C']; describe('check array', () => { it('should not contain D', async () => { const monitor = new Monitor(); // 等待Promise完成再执行断言 await monitor.ready(); expect(list.indexOf('D')).toEqual(1); }); });
修改后重新运行测试,就会正常触发断言失败的提示。
内容的提问来源于stack exchange,提问作者DamiToma
相关产品推荐
相关产品推荐

