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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:47:37