Jest测试时isbn模块丢失问题排查与原因定位
Jest测试中
isbn模块导出为空的问题解决 问题场景
给依赖NPM isbn包的旧代码库写测试时遇到异常:直接运行业务代码能正常获取ISBN对象,但Jest测试里ISBN变成undefined,导致测试失败。
复现代码
- 业务文件
isbnTest.js:
const { ISBN } = require("isbn"); function isbnExists() { return ISBN !== undefined; } console.log(isbnExists()); // 直接运行输出 true module.exports = { isbnExists, };
- 测试文件
isbnTest.test.js:
const { isbnExists } = require("./isbnTest.js"); test("isbn should exist", () => { expect(isbnExists()).toBe(true); // 运行npm test时失败,返回false });
问题根因
排查isbn模块源码后发现,是这段代码导致的问题:
var exports = typeof window === 'object' && window ? window: module.exports;
Jest默认使用jsdom环境模拟浏览器,此时window对象存在,模块会把exports指向window而非Node.js环境的module.exports,最终导致业务代码拿不到预期的导出内容。
解决办法
1. 切换Jest运行环境为Node.js
在项目的jest.config.js中修改配置:
module.exports = { testEnvironment: 'node', // 其他配置... };
这样Jest不会模拟浏览器的window对象,isbn模块会正常使用module.exports导出内容。
2. 手动Mockisbn模块
如果不想切换环境,可以手动让Jest加载真实的isbn模块:
- 方式一:在测试文件顶部添加:
jest.mock('isbn', () => jest.requireActual('isbn'));
- 方式二:在项目根目录创建
__mocks__/isbn.js文件,内容如下:
const actualIsbn = jest.requireActual('isbn'); module.exports = actualIsbn;
3. 修改isbn模块源码(不推荐)
直接注释掉isbn模块里那行有问题的代码,但这种方式需要修改node_modules内的文件,后续安装依赖会覆盖修改,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者fnsjdnfksjdb
相关产品推荐
相关产品推荐

