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;
- 显式指定测试环境为jsdom:在
场景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耗时过长触发超时
- 禁用FakeTimers:如果测试不需要模拟定时器,在测试用例中添加
内容的提问来源于stack exchange,提问作者GRZa
相关产品推荐
相关产品推荐

