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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:05:16