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

Jest从v26升级到v29时JSZip generateAsync超时问题求助

Jest从v26升级到v29时JSZip.generateAsync调用异常的解决思路

问题背景

升级Jest从v26到v29版本后,执行JSZip生成Blob的测试代码时出现多类异常,测试代码如下:

console.log("before fzip", JSZip.support.blob);
const fzip = await zip.generateAsync({ type: "blob" });
console.log("fzip", fzip);

对应场景的解决办法

场景1:移除jest-environment-jsdom后报TypeError: this._timerAPIs.setImmediate is not a function

  • 问题根因:Jest默认使用node环境,该环境下FakeTimers未模拟setImmediate,但JSZip内部依赖了这个API
  • 解决方式二选一:
    • 显式指定测试环境为jsdom:在jest.config.js中配置testEnvironment: 'jsdom',或在单个测试文件顶部添加注释/** @jest-environment jsdom */
    • 手动模拟setImmediate:在测试文件开头添加代码:
      global.setImmediate = global.setTimeout;
      

场景2:升级到Jest v29 + jest-environment-jsdom v29后调用超时

  • 问题根因:Jest v29的jsdom环境对异步流程的处理逻辑有调整,且generateAsync属于CPU密集型异步操作,容易被FakeTimers阻塞;另外v29的jsdom对Blob的支持可能存在兼容性问题
  • 解决思路(可组合尝试):
    • 禁用FakeTimers:如果测试不需要模拟定时器,在测试用例中添加jest.useRealTimers(),避免阻塞JSZip的异步执行
    • 升级JSZip版本:确保使用最新稳定版的JSZip,提升与Jest v29的兼容性
    • 手动注入Blob实现:在测试文件开头添加代码,替换jsdom的Blob为node环境的实现:
      global.Blob = require('node:buffer').Blob;
      
    • 延长测试超时时间:在jest.config.js中设置testTimeout: 10000(根据实际情况调整时长),避免因生成Blob耗时过长触发超时

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:30:57