恢复被 mock 的原始函数关键在于及时清理 mock 状态,推荐在 afterEach 中调用 jest.restoreAllMocks() 批量恢复 spy;对单个 spy 可调用 mockRestore();避免直接赋值覆盖;模块 mock 需配合 resetModules 或 unmock 清理。

在 JavaScript 测试中,恢复被 mock 的原始函数关键在于**及时清理 mock 状态**,避免污染其他测试用例。Jest 提供了多种方式,最常用且推荐的是使用 jest.restoreAllMocks() 或手动调用 mockRestore()。
使用 jest.restoreAllMocks()(推荐)
这是 Jest 内置的批量恢复方法,适合在每个测试后统一清理:
- 在
afterEach钩子中调用,确保每次测试执行完都还原所有被jest.spyOn().mockImplementation()或jest.fn()替换的函数 - 它会恢复所有通过
jest.spyOn(obj, 'method').mockImplementation(...)创建的 spy,前提是该 spy 调用了mockImplementation或mockReturnValue等方法 - 注意:
jest.restoreAllMocks()不影响直接赋值覆盖(如obj.method = jest.fn()),只作用于jest.spyOn创建的 spy
对单个 spy 显式调用 mockRestore()
适用于需要精确控制恢复时机的场景:
- 调用
jest.spyOn(obj, 'method').mockImplementation(...)后,保存返回的 spy 引用 - 在
afterEach或测试末尾主动调用spy.mockRestore() - 示例:const spy = jest.spyOn(console, 'log').mockImplementation(() => {}); ... spy.mockRestore();
避免手动赋值导致无法恢复
如果用直接赋值方式替换函数(如 originalFn = jest.fn()),Jest 无法自动追踪原始引用,也就无法恢复:
立即学习“Java免费学习笔记(深入)”;
- 应优先使用
jest.spyOn(obj, 'methodName'),它内部保存了原始函数的引用 - 若必须替换模块导出函数,可配合
jest.mock('./module', () => ({ fn: jest.fn() }))并在测试后调用jest.resetModules()或jest.unmock('./module')
模块级 mock 的清理
对整个模块做 jest.mock() 时,原始实现默认不会自动恢复:
- 在
afterEach中调用jest.resetModules()可清空模块缓存,使下次require或import加载真实模块 - 或使用
jest.unmock('./module')显式取消 mock(需配合jest.resetModules()才能生效) - 更稳妥的做法是把
jest.mock()放在测试文件顶部,并依赖 Jest 的自动隔离机制;如需动态控制,用jest.doMock()+jest.dontMock()


















