如何使用Jest模拟外部npm包中的单个文件?
解决Jest模拟外部包单个文件的问题
问题根源
你直接模拟@company/product/sdk/api/prefs.js但未生效,核心原因是业务代码采用整体引入整个SDK包的方式(import * as sdk from "@company/product"),而非单独引入prefs.js。此时Jest的模块解析会优先加载SDK主入口导出的内容,而非你单独mock的子文件。
可行解决方案
方案1:Mock整个SDK包,仅替换目标导出项
既然业务代码是整体引入SDK,直接mock整个包,在模块工厂中保留原SDK的其他导出,仅替换Prefs:
// someFile.spec.ts import * as sdk from "@company/product"; const prefs: IPrefs = { some_property: -1 }; jest.mock("@company/product", () => { // 引入真实SDK模块 const originalModule = jest.requireActual("@company/product"); // 保留原有导出,仅替换Prefs return { ...originalModule, Prefs: prefs }; });
方案2:调整业务代码的引入方式(若允许)
如果可以修改业务代码,改为单独引入Prefs,此时你原本的mock代码就能正常生效:
// someFile.ts 修改为单独引入 import { Prefs } from "@company/product/sdk/api/prefs.js";
方案3:用Jest的moduleNameMapper映射子路径
无需修改业务代码,通过jest.config.js配置路径映射,让Jest优先加载你的mock文件:
// jest.config.js module.exports = { // 其他配置项... moduleNameMapper: { "^@company/product/sdk/api/prefs.js$": "<rootDir>/__mocks__/prefs.mock.ts" } };
然后在项目根目录创建__mocks__/prefs.mock.ts,写入模拟内容:
// __mocks__/prefs.mock.ts export const Prefs = { some_property: -1 };
验证Mock是否生效
在测试代码中添加验证逻辑,确认模拟成功:
test("验证Prefs已被模拟", () => { expect(sdk.Prefs.some_property).toBe(-1); });
内容的提问来源于stack exchange,提问作者4ntoine
相关产品推荐
相关产品推荐

