安全还原被 Mock 的方法需避免状态污染、确保干净起点、不依赖全局副作用;应使用 mockRestore() 还原 spyOn 方法,mockReset() 重置 jest.fn(),优先模块级 mock 和依赖注入,异步测试中须等待完成后再还原。

安全还原被 Mock 的方法,关键在于**避免测试间状态污染、确保每次测试从干净起点开始、不依赖全局副作用**。不是简单“恢复原样”,而是有策略地控制 mock 生命周期。
用 mockRestore() 还原被 spyOn 的方法
当你用 jest.spyOn(obj, 'method') 替换对象上的已有方法时,mockRestore() 是最直接的安全还原方式:
- 它会把方法恢复为原始实现(包括原型链上的方法)
- 必须在
afterEach或afterAll中调用,不能只靠beforeEach清理 - 如果未调用
mockRestore(),后续测试可能意外使用上一个测试的 mock 行为
示例:
const originalNow = Date.now;const spy = jest.spyOn(Date, 'now').mockImplementation(() => 1234567890);
expect(Date.now()).toBe(1234567890);
spy.mockRestore();
expect(Date.now()).toBeGreaterThan(originalNow() - 1000);
用 mockClear() 或 mockReset() 重置行为,而非还原
对纯 jest.fn() 创建的 mock,没有“原始实现”可还原,此时应区分使用:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
mockClear():清空调用记录(mock.calls、mock.instances),但保留返回值设定(如mockReturnValue) -
mockReset():清空记录 + 重置所有返回值/实现设定,回归初始jest.fn()状态 - 推荐在
beforeEach中调用mockReset(),确保每个测试用例独立
避免手动赋值还原,改用模块级隔离
不要这样写:
const originalMethod = myModule.doSomething;myModule.doSomething = jest.fn();
// ... 测试
myModule.doSomething = originalMethod; // ❌ 风险高:可能漏还原、冻结对象报错、多测试并发冲突
更安全的做法是:
- 用
jest.mock('./module', () => {...})在模块层面 mock,Jest 自动管理生命周期 - 若需部分 mock,用
jest.requireActual()委托未 mock 方法,不碰原始导出对象 - 依赖注入场景下,让被测代码接收 mock 实例,测试结束即丢弃,无需还原
注意异步测试中的还原时机
如果 mock 影响了 Promise 或事件监听器,还原必须等异步操作完成后再执行:
- 在
await异步断言后调用mockRestore() - 避免在
setTimeout或Promise.then外部提前还原,否则回调里仍会触发 mock 行为 - 对全局事件(如
window.addEventListener)mock 后,记得在afterEach中移除监听器

















