Jasmine中使用expectAsync测试异步函数触发超时失败问题求助
你的Jasmine测试超时问题分析与修复
看起来你在写异步测试时踩了几个常见的坑,导致测试触发超时错误。我来一步步帮你理清问题所在,然后给出修正方案:
1. expectAsync 的使用对象错误
你当前写的 await expectAsync(test.rejectFunc).toBeRejected(); 是把函数引用传给了expectAsync,但这个方法需要接收的是一个已执行的Promise实例。你现在相当于在断言一个函数本身会被拒绝,这完全不符合逻辑,自然不会触发正确的异步等待。
2. async/await 与 done 混用导致的流程混乱
你给测试函数加了async修饰符,同时又传入了done回调——这在Jasmine里是冲突的用法。使用async/await时,Jasmine会自动等待函数内的异步操作完成,不需要再手动调用done;混用的话很容易因为异步流程没正确收尾,导致测试超时。
3. 未等待 test.run() 的执行流程
你调用了test.run()但没有等待它完成,这会导致你的断言可能在rejectFunc的Promise被拒绝之前就执行了,进而让Jasmine误以为异步回调没被触发,最终抛出超时错误。
修正后的完整测试代码
it("should get rejected", async () => { class someTest { async run(){ return this.rejectFunc(); } async rejectFunc(){ return new Promise( (_,reject)=>{ setTimeout(()=>{ reject() },300) }) } } const test = new someTest(); spyOn(test, 'rejectFunc').and.callThrough(); // 等待run方法执行,同时验证它返回的Promise被拒绝 await expectAsync(test.run()).toBeRejected(); // 可选:验证rejectFunc确实被run方法调用了 expect(test.rejectFunc).toHaveBeenCalled(); });
额外说明
如果你想单独验证rejectFunc自身的拒绝行为,也可以直接调用它并断言:await expectAsync(test.rejectFunc()).toBeRejected();,但结合你的需求(调用run方法并验证rejectFunc会被拒绝),验证test.run()返回的Promise更贴合实际业务场景,也能间接证明rejectFunc的执行结果符合预期。
内容的提问来源于stack exchange,提问作者Yaron
相关产品推荐
相关产品推荐

