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

Jest包含全部5个测试用例时无限运行问题求助

Jest + Preact Testing Library 全量测试用例无限运行问题

问题详情

当前环境:Jest v26.6.3、@testing-library/preact v2.0.1
测试文件包含5个测试用例,单个运行、任意4个组合运行均正常,但全部5个一起运行时会无限执行(曾后台运行约5小时),全程无错误或失败提示。

已尝试的解决方法

以下操作均未解决问题:

  • 在describe块的beforeEach中完成必要模拟调用,并执行jest.clearAllMocks()
  • 在describe块和beforeEach中设置jest.setTimeout(20000)
  • 在beforeEach和afterEach中调用Preact Testing Library的cleanup()
  • 在beforeEach中执行jest.resetAllMocks()
  • 运行命令npm run test [test file name] --forceExit --detectOpenHandles排查,结果仍无限运行

排查方向与解决方案

1. 清理异步操作泄漏

全量运行才触发问题,大概率是异步操作未正确清理:

  • 检查未取消的定时器:某个测试用例创建了setTimeout/setInterval但未在afterEach中清除
  • 检查未终止的Promise:比如模拟API请求时设置了无限等待的Promise,或存在循环Promise链
  • 检查未取消的事件订阅:组件卸载后未移除自定义事件、store订阅等监听

可在每个测试用例的afterEach中针对性清理:

afterEach(() => {
  jest.clearAllTimers();
  // 若有自定义事件订阅,在此处执行取消操作
});

2. 彻底重置Mock副作用

多个测试用例运行时,Mock实现可能互相干扰:

  • 检查是否存在设置为无限等待的Mock(比如jest.fn().mockImplementation(() => new Promise(() => {})))
  • 确保Mock状态不会被后续用例继承

建议在afterEach中彻底重置Mock:

afterEach(() => {
  jest.resetAllMocks();
  jest.restoreAllMocks();
});

3. 排查测试用例执行顺序冲突

Jest单个文件内的测试用例执行顺序可能触发状态污染,可通过.only逐个组合排查:

  • 先运行前4个用例,再运行后4个用例,定位重叠的可疑用例
  • 检查该用例的状态清理逻辑,确认是否存在未清除的全局状态

4. 升级依赖版本(谨慎操作)

当前使用的Jest和Testing Library版本较旧,可能存在已知的内存泄漏或异步清理bug。可尝试升级到对应大版本的最新小版本(比如Jest v26.x最新版、@testing-library/preact v2.x最新版),验证问题是否解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:43:23