清除 mock 状态用 jest.clearallmocks() 重置调用记录,恢复原始实现用 jest.restoreallmocks(),手动覆盖的全局方法需自行保存并还原原始引用。

在 JavaScript Mock 中清除和恢复被模拟的接口状态,核心是控制 jest.mock() 或手动替换的函数(如 fetch、axios.get)的“记忆”与行为。关键在于区分 mock 的作用域、重置时机和还原方式。
使用 jest.clearAllMocks() 清除调用记录
该方法不会删除 mock 函数本身,只清空所有已记录的调用次数、参数、返回值等状态,适合在每个测试用例后重置“行为痕迹”:
- 通常放在
afterEach钩子中,确保每个测试独立 - 不影响 mock 的实现逻辑(比如你用
mockImplementation定义的返回值仍生效) - 示例:
afterEach(() => {<br> jest.clearAllMocks();<br>});
使用 jest.restoreAllMocks() 恢复原始实现
当你用 jest.spyOn(obj, 'method').mockImplementation(...) 或 jest.mock('module') 替换了真实函数,restoreAllMocks 会把它们全部还原为原始行为(包括未 mock 前的函数、模块导出等):
- 适用于需要“彻底回归真实环境”的场景,比如某个测试里临时 mock 后,后续测试必须走真实请求
- 注意:它只对通过
jest.spyOn或jest.mock创建的 mock 生效;手动赋值(如window.fetch = jest.fn())需自行恢复 - 建议搭配
beforeEach/afterEach使用,避免污染其他测试
手动 mock 的清理:记得还原全局对象
若直接覆盖了全局方法(如 global.fetch 或 XMLHttpRequest),Jest 不会自动管理,必须手动还原:
- 保存原始引用再恢复:
const originalFetch = global.fetch;<br>beforeEach(() => {<br> global.fetch = jest.fn().mockResolvedValue({ json: () => ({ ok: true }) });<br>});<br>afterEach(() => {<br> global.fetch = originalFetch;<br>}); - 也可用
jest.resetModules()配合jest.unmock()处理模块级 mock,尤其在测试中动态引入模块时
模块级 mock 的隔离:用 jest.mock() 的工厂函数 + 自动清理
在文件顶部使用 jest.mock('./api', () => {...}) 时,Jest 默认会在每个测试文件执行前自动重置该 mock —— 但前提是没设置 setupFilesAfterEnv 干扰或跨文件复用 mock:
- 确保 mock 定义在测试文件内(或通过
__mocks__目录规范管理) - 若需在多个测试间共享 mock 行为,改用
jest.doMock()并配合显式jest.dontMock() - 避免在
setupFiles中全局 mock 接口,否则难以按需清除
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











