重置模块模拟状态的核心方法是jest.resetModules()、jest.clearAllMocks()和jest.restoreAllMocks(),分别用于重置模块缓存、清空调用记录、还原被spy覆盖的原始方法。

在 JavaScript 单元测试中,重置模块模拟(mock)状态的核心方法是使用 Jest 提供的 jest.resetModules()、jest.clearAllMocks() 和 jest.restoreAllMocks(),具体选哪个取决于你 mock 的方式和想清理的范围。
重置整个模块系统的导入缓存
当你用 jest.mock() 自动 mock 一个模块(尤其是外部依赖),Jest 会缓存该模块的 mock 实现。若多个测试文件或同一文件内多次 import 同一模块,可能因缓存导致 mock 状态残留(比如 mock 函数被多次调用后 mock.calls 积累)。
此时应在每个测试前清除模块缓存:
- 在
beforeEach中调用 jest.resetModules():重置模块注册表,使下一次import或require重新执行模块初始化(包括重新运行jest.mock()回调) - 搭配
jest.unmock('xxx')可对特定模块取消 mock,再重新控制其行为
清空所有 mock 函数的调用记录和返回值
jest.clearAllMocks() 不影响 mock 的实现逻辑(如 mockImplementation),只重置调用历史:mock.calls、mock.instances、mock.results 全部清空。
立即学习“Java免费学习笔记(深入)”;
- 适合在
beforeEach中调用,确保每个测试从干净的调用状态开始 - 注意:它不恢复被
jest.spyOn().mockImplementation()替换的方法,仅清记录
还原被 spy 替换的原始方法
如果你用 jest.spyOn(obj, 'method') 并调用了 .mockImplementation(),原始方法已被覆盖。测试结束后需手动还原,否则会影响后续测试。
- 在
afterEach或afterAll中调用 jest.restoreAllMocks():它会还原所有被spyOn替换的属性(包括 getter/setter)到原始值 - 也可在单个 spy 后直接调用
mockRestore(),更精准可控
常见组合写法示例
一个稳健的测试设置通常这样组织:
beforeEach(() => {
jest.resetModules(); // 重置模块缓存
jest.clearAllMocks(); // 清空所有 mock 调用记录
});
afterEach(() => {
jest.restoreAllMocks(); // 还原所有被 spy 的原始方法
});
如果只 mock 了少数几个函数且没用 spyOn,可能只需 clearAllMocks;如果大量使用 jest.mock('./utils') + 内部 require,resetModules 就不可少。


















