mock-require 是 node.js 中轻量级模块依赖替换工具,通过劫持 require 缓存实现测试隔离,需在被测模块加载前 mock 并调用 stopall() 清理,支持默认/命名导出模拟及路径精准匹配。

在 CommonJS 环境下(如 Node.js),使用 mock-require 是一种轻量、直接的模块依赖替换方式,特别适合单元测试中隔离外部依赖(如数据库、HTTP 客户端、配置文件等)。它通过劫持 require 的内部缓存机制,在测试运行前动态注入模拟实现。
安装与基础用法
mock-require 不修改全局 require,而是临时覆盖模块缓存,作用域可控。需在测试前加载并启用:
- 安装:
npm install --save-dev mock-require - 在测试文件顶部引入并调用
mock-require函数,传入目标模块路径和模拟实现 - 测试结束后务必调用
mock-require.stopAll()清理缓存,避免污染其他测试
模拟具体模块导出
支持模拟默认导出、命名导出或整个模块对象。例如,替换 fs 模块的 readFileSync:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
const mockRequire = require('mock-require');
// 替换 fs 模块,只 mock readFileSync
mockRequire('fs', {
readFileSync: jest.fn().mockReturnValue('mocked content'),
writeFileSync: jest.fn()
});
// 此时被测模块 require('fs') 将拿到这个对象
const myModule = require('./my-module'); // 注意:必须在 mock 后再 require
// 执行测试逻辑...
expect(myModule.readFile()).toBe('mocked content');
按需重置与局部作用域控制
每个测试用例应独立管理 mock 状态。推荐在 beforeEach 中设置、afterEach 中清理:
- 用
mockRequire.reRequire('./target')获取新 require 实例(绕过缓存),确保每次测试加载干净模块 - 对同一模块多次 mock 时,后一次会覆盖前一次;若需还原原始模块,调用
mockRequire.stop('module-name') - 避免在
describe外部提前 require 被测模块——否则它已加载原始依赖,mock 失效
处理相对路径与深层依赖
CommonJS 中模块路径解析基于调用者位置。mock 时路径必须与被测模块内部 require 的路径完全一致(包括 ./、../):
- 例如被测模块写
require('../utils/api'),mock 时也得写mockRequire('../utils/api', mockApi) - 可借助
path.resolve(__dirname, '../utils/api')确保路径准确 - 若依赖链较深(A → B → C),只需 mock 最终要替换的模块 C;B 和 A 无需改动,它们仍通过
require加载被 mock 的 C
不复杂但容易忽略的是缓存时机和路径一致性——mock 必须在目标模块 require 之前生效,且路径字符串必须一字不差。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










