使用Jest和mock-fs测试异步fs.readfile设30秒超时仍失败如何解决
问题根因
该超时问题核心是mock-fs无法正确触发readFile的回调函数,导致你封装的Promise永远处于pending状态,最终触发超时,常见原因有3种:
- Jest测试环境配置为浏览器模拟环境(如jsdom),
mock-fs无法在非Node原生环境下正确hook文件系统API - 配置项
createCwd: false导致相对路径解析异常,文件路径无法匹配到mock的文件资源 mock-fs版本和当前Node版本不兼容,新版本Node的fs API在旧版mock-fs下存在回调不触发的bug
解决方案
1. 修正Jest测试环境
检查你的jest配置文件,将测试环境改为Node原生环境:
// jest.config.js module.exports = { // 其余配置保留 testEnvironment: 'node' }
如果仅需要为单文件指定测试环境,在测试文件顶部添加如下注释即可:
/** * @jest-environment node */
2. 调整mock-fs路径配置
如果必须保留createCwd: false来兼容node-glob,就使用绝对路径访问mock文件,避免相对路径解析失败:
// 修改测试用例中的调用代码 FileContents = await ReadFileContents(`${process.cwd()}/datafiles`, 'abc.txt');
如果不需要兼容特殊场景,直接删除createCwd: false配置即可,默认会生成当前工作目录,相对路径可正常解析。
3. 升级依赖版本
如果使用Node 16+版本,将mock-fs升级到v5.2.0以上,解决API兼容问题:
npm i mock-fs@latest -D
另外注意核对测试用例中读取的文件名和mock的文件名是否一致,你报错信息中读取的是abc.hdr,但mock配置里的是abc.txt,文件名不匹配也会触发异常。
内容的提问来源于stack exchange,提问作者Steven Scott
相关产品推荐
相关产品推荐

