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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:09:59