You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Jest中,用jest.fn()与spyOn直接模拟原型方法有区别吗?

关于Jest模拟类方法的两种写法选择偏好

假设我有如下的Foo类:

class Foo {
  bar() {
    return 'bar';
  }
}

我想要模拟其中的bar方法,以下两种写法是否存在选择偏好?

写法一:

jest.spyOn(Foo.prototype, 'bar').mockImplementation(() => 'baz');

对比写法二:

Foo.prototype.bar = jest.fn().mockImplementation(() => 'baz');

我尝试过这两种写法,看起来效果完全一致。


核心差异与选择建议

这两种写法表面运行效果一致,但底层逻辑和适用场景有明显区别,优先推荐第一种jest.spyOn的写法,原因如下:

  • 支持一键恢复原方法:spyOn创建的mock可以通过mockRestore()方法直接恢复原方法的实现,在多测试用例的场景下,能有效避免用例之间的污染。而第二种写法直接覆盖了原型上的方法,想要恢复必须提前手动保存原方法引用,操作繁琐且容易遗漏。
  • 保留原方法的调用追踪:spyOn默认会保留原方法的调用记录(比如调用次数、传入参数、返回值等),即使替换了实现,也能通过mock.calls、mock.results等属性查看调用详情。第二种写法的jest.fn()是全新的空mock函数,不会关联原方法的任何调用信息。
  • 语义更明确:spyOn清晰表达了“监听/模拟已有方法”的意图,可读性更强,团队协作时能让其他开发者快速理解测试逻辑。

只有当你确定不需要恢复原方法、也不关心原方法的调用信息时,第二种写法才可以作为简化选项使用,但绝大多数测试场景下,spyOn的灵活性和可维护性都更优。

内容的提问来源于stack exchange,提问作者zed917

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:45:43