JavaScript 中 Mock 第三方 npm 依赖包的核心是 jest.mock() 或手动替换模块导出,确保测试隔离真实行为;需在 import 前调用 mock,支持返回值设定、调用断言及全局 API 替换,并注意 ESM 缓存与时机问题。

JavaScript 中 Mock 第三方 npm 依赖包,核心是用 Jest 的 jest.mock() 或手动替换模块导出,让测试不依赖真实行为,只验证逻辑本身。
用 jest.mock() 替换整个模块
这是最常用、最可靠的方式,尤其适合 axios、fs、crypto 等 Node.js 内置或第三方包。Jest 会在模块加载前拦截并注入模拟实现。
- 在测试文件顶部调用
jest.mock('axios'),之后所有require('axios')或import axios from 'axios'都会拿到 mock 版本 - 为方法指定返回值:
axios.get.mockResolvedValue({ data: { id: 1 } }) - 断言是否按预期调用:
expect(axios.post).toHaveBeenCalledWith('/api/login', { user: 'a' }) - 注意:mock 必须在
import或require对应模块之前调用,否则无效
手动 mock 模块(适用于无默认导出或需精细控制)
当 jest.mock() 自动模拟不够灵活时,可手写 mock 文件或内联工厂函数。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建
__mocks__/lodash.js,内容为:module.exports = { debounce: jest.fn((fn) => fn) } - 或在测试中传入工厂函数:
jest.mock('lodash', () => ({ debounce: jest.fn() })) - 这样能完全控制每个导出的形态,比如让
get返回固定值,set只记录参数
Mock 全局变量或浏览器 API
有些包依赖 window.fetch、localStorage 或 Date.now(),这些不属于 npm 包但常被当作“外部依赖”处理。
立即学习“Java免费学习笔记(深入)”;
- 在测试前重写:
global.fetch = jest.fn().mockResolvedValue({ json: () => ({ ok: true }) }) - 恢复原生行为可用
jest.restoreAllMocks()(推荐放在afterEach中) - 对定时器:
jest.useFakeTimers()+jest.runAllTimers()控制setTimeout执行时机
避免常见陷阱
Mock 不生效?报错“Cannot find module”?多半是路径或时机问题。
-
jest.mock()不能写在describe或test内部(除非用jest.doMock()) - ESM 项目中,若使用
import,确保jest.config.js启用了transform并支持 ESM,或改用require方式导入被测模块 - 不要在 mock 后又
require原模块——它已被 Jest 缓存,必须清缓存:jest.resetModules()+jest.unmock('xxx')配合使用

















