如何在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
相关产品推荐
相关产品推荐

