mockClear只清调用记录,保留实现和返回值;mockReset清调用记录并重置模拟实现为默认空函数;mockRestore仅用于jest.mock()创建的自动mock以还原原始模块。

在 Jest 中,mockClear 和 mockReset 都用于清理 Mock 函数的调用状态,但它们清除的范围不同,选错可能导致测试误判或残留副作用。
mockClear:只清调用记录,保留实现和返回值配置
它重置的是「调用历史」相关数据:调用次数、传入参数、返回值、抛出错误等,但不会动你手动设置的 mockImplementation 或 mockReturnValue。
-
适用场景:同一 mock 函数在多个 test 中复用,每次只想清空上次的调用痕迹,但保持行为一致(比如始终返回
{ ok: true }) -
典型写法:
jest.fn().mockReturnValue(42).mockClear()→ 之后调用仍返回42,但mock.calls变为空数组
mockReset:清调用记录 + 重置模拟实现
它比 mockClear 更彻底:除了清空调用历史,还会把 mock 的内部实现恢复为默认的空函数(() => undefined),并丢弃所有 mockReturnValue、mockImplementationOnce 等配置。
-
适用场景:需要让 mock 回到“完全未配置”的初始状态,比如在
beforeEach中统一重置,避免上一个 test 的配置干扰下一个 -
注意:重置后若不重新配置,调用该 mock 将返回
undefined,且不会报错
mockRestore:仅用于 jest.mock() 创建的自动 mock
这不是清除方法,而是「还原原始模块」的工具。仅当使用 jest.mock('module') 自动 mock 后,才可用 mockRestore() 恢复真实模块逻辑(常用于 afterEach 清理)。
-
不能对
jest.fn()调用:会报TypeError: mock.restore is not a function -
必须配合
jest.mock()使用才有意义
实际建议:按测试粒度选择
- 单个
test内多次调用 mock?用mockClear()即可 -
beforeEach中统一初始化 mock?推荐mockReset(),确保每个 test 从干净起点开始 - 用了
jest.mock('./utils')并修改了其导出?记得在afterEach或afterAll中调jest.unmock('./utils')或mockRestore()











