使用Jest仅通过回调实现异步测试,捕获Promise报错的测试失败如何解决
错误原因
- 同步
try/catch仅能捕获同步执行栈内的错误,你代码中Promise的reject是在setTimeout异步回调中触发的,不属于同步执行上下文,try/catch无法捕获到该异步拒绝错误。 - 你未给创建的Promise绑定错误处理回调,
reject触发后会直接抛出未处理的Promise拒绝异常,Jest会直接判定测试失败,不会进入你编写的catch代码块。
修复方案
给Promise链式调用catch方法,在catch回调中完成断言后调用done通知Jest异步测试结束即可,修复后代码如下:
test('Test unhandled promise rejection', function (done) { expect.assertions(1); new Promise(function (resolve, reject) { setTimeout(function () { reject('errorrrrr'); }, 100); }).catch((error) => { // 此处可以根据需要调整断言逻辑 expect(error).toBe('errorrrrr'); done(); }); });
补充说明:如果后续使用async/await写法做异步测试,可以用try/catch包裹await语句捕获异步错误,但必须要await对应的Promise实例,否则仍然无法捕获错误。
内容的提问来源于stack exchange,提问作者cj-2307
相关产品推荐
相关产品推荐

