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

如何在Jasmine测试中正确使用not.toBeResolved()方法?

解决Jasmine测试Promise不resolve时的超时问题

你遇到的问题根源在于对not.toBeResolved()的逻辑理解有误:这个断言并不会主动在等待一段时间后判定“未resolve就通过”,它会一直等待Promise的状态变化——如果Promise始终处于pending状态,Jasmine无法确定它未来会不会resolve,就会一直等到默认的5000ms超时时间,最终抛出超时错误。

正确的测试方案

我们需要主动设置一个较短的等待窗口,确认在这段时间内Promise没有resolve,即可判定测试通过(因为我们明确知道这个Promise是永远不会resolve的)。

方案1:使用setTimeout配合done

it('should not resolve', (done) => {
  const unresolvablePromise = new Promise((resolve, reject) => {});
  
  // 等待100ms,确认Promise仍未触发resolve
  setTimeout(() => {
    expectAsync(unresolvablePromise).not.toBeResolved();
    done();
  }, 100);
}, 200); // 给测试设置200ms的整体超时,避免不必要的长时间等待

方案2:利用Promise.race实现超时判断

it('should not resolve', async () => {
  const unresolvablePromise = new Promise((resolve, reject) => {});
  // 创建一个100ms后完成的超时Promise
  const timeoutPromise = new Promise(resolve => setTimeout(resolve, 100));
  
  // 让两个Promise竞争,若超时Promise先完成,说明原Promise未resolve
  await Promise.race([unresolvablePromise, timeoutPromise]);
  
  // 此时验证原Promise仍处于未resolved状态
  expectAsync(unresolvablePromise).not.toBeResolved();
}, 200);

补充说明

Jasmine的异步断言逻辑:

  • toBeResolved()会等待Promise变为resolved状态,若变为rejected则测试失败
  • not.toBeResolved()会等待Promise变为rejected状态则通过,但若Promise一直pending,就会触发测试超时

所以针对“永远不resolve的Promise”,必须主动限制等待时间,避免触发Jasmine的默认超时。

内容的提问来源于stack exchange,提问作者wlf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:18:35