jest 中彻底重置 mock 需组合使用:jest.clearallmocks() 清调用记录,jest.resetallmocks() 重置实现与记录,jest.resetmodules() 清模块缓存,jest.restoreallmocks() 还原 spy;注意 jest.mock() 提升特性及避免泄漏。

在 Jest 中重置和清空所有 mock 状态,关键在于区分 mock 函数本身的状态(如调用次数、参数记录)和 模块级别的 mock 替换行为(如 jest.mock() 的自动替换)。Jest 提供了多层级的清理机制,按需组合使用即可彻底重置。
1. 重置单个 mock 函数的调用状态
适用于手动创建的 mock 函数(如 jest.fn())或已 mock 的模块方法:
-
mockFn.mockClear():清除调用记录(mock.calls、mock.instances等),但保留 mock 的实现(mockImplementation)和返回值设定 -
mockFn.mockReset():在mockClear()基础上,还重置 mock 实现为undefined,返回值恢复为默认(undefined) -
mockFn.mockRestore():仅对通过jest.spyOn()创建的 spy 有效,还原被 spy 的原始方法;对jest.fn()无效果(因原本就无真实函数可还原)
2. 全局重置所有自动 mock 的模块状态
当使用 jest.mock('module') 自动 mock 模块时,每个测试文件或测试用例中 mock 的状态是独立的,但同一文件内多次测试可能累积状态。推荐在测试前/后统一清理:
-
jest.clearAllMocks():清除所有 mock 函数的调用记录(等价于对每个 mock 调用mockClear()) -
jest.resetAllMocks():重置所有 mock 函数的实现和调用记录(等价于对每个 mock 调用mockReset()) -
jest.restoreAllMocks():还原所有通过jest.spyOn()创建的 spy,恢复原始方法
通常在 beforeEach 或 afterEach 中调用,例如:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
beforeEach(() => {
jest.clearAllMocks();
});
3. 避免 mock “泄漏”:注意 jest.mock() 的提升行为
jest.mock() 会被提升到文件顶部,且默认是“自动模拟”(auto-mock),它的 mock 实现不会被 clearAllMocks 重置——因为它是模块级替换,不是函数实例。若需在测试中动态修改其行为,应:
- 在
beforeEach中重新指定实现:require('module').someFn.mockImplementation(...) - 或使用
jest.doMock()(不提升,按需加载)配合jest.requireActual()控制模拟时机 - 避免在
describe外层多次调用jest.mock(),否则可能触发重复 mock 报错
4. 完整清理策略(推荐组合)
为确保每个测试完全隔离,建议在 beforeEach 中执行:
-
jest.clearAllMocks()→ 清除调用痕迹 -
jest.resetModules()→ 重置require缓存,让下一次import或require加载新模块实例(尤其重要!用于清除jest.mock()引起的模块缓存污染)
如果测试中用了 jest.spyOn(),再加一句 jest.restoreAllMocks()。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










