jest 中 jest.fn() 和 jest.spyOn() 方法有什么区别?

问题描述 投票:0回答:3

我正在为我的 React 项目编写单元测试用例,并使用笑话和酶来编写测试用例。我已阅读笑话文档

https://jestjs.io/docs/en/jest-object.html#jestspyonobject-methodname

解释了

jest.spyOn()
方法,但我不完全理解。

所以我想知道更多关于我们应该在哪里使用

jest.fn()
以及在哪里我们应该/必须使用
jest.spyOn()
的具体信息。如果可以用这两种方法的示例来解释,那就会有很大的帮助。

谢谢

reactjs mocking jestjs spy
3个回答
101
投票

我对react/frontend项目中这两个函数的简单理解如下:

jest.fn()

  • 你想模拟一个函数,但实际上并不关心该函数的原始实现(它将被
    jest.fn()
    覆盖)
  • 通常你只是嘲笑返回值
  • 如果您想在测试中删除对后端的依赖(例如,调用后端 API 时)或第三方库,这非常有帮助
  • 如果您想进行真正的单元测试,它也非常有帮助。您不关心您测试的单元调用的某些函数是否正常工作,因为这不是它的责任的一部分。

jest.spyOn()

  • 该函数的原始实现与您的测试相关,但是:
    • 您想为特定场景添加自己的实现,然后通过
      mockRestore()
      再次重置它(如果您只是使用
      jest.spyOn()
      而不进一步模拟它,默认情况下它仍然会调用原始函数)
    • 你只是想看看该函数是否被调用了
    • ...
  • 我认为这对于集成测试特别有帮助,但不仅仅只对他们有用!

(好博文:https://medium.com/@rickhanlonii/understanding-jest-mocks-f0046c68e53c


43
投票

据我了解,唯一的区别是您可以使用jest.spyOn

恢复原始功能
,而不能使用
jest.fn

假设我们有一些钩子在组件渲染时调用一个函数,这里我们可以只检查函数被调用,我们不测试该函数。

另一种情况,如果我们想要原始函数来测试它是如何工作的。我们需要将两者放在一个测试文件中。

真实方法:

myMethod() {
  return 33;
}

jest.fn()

const myMethod = jest.fn().mockImplementation(() => 25);
const result = myMethod();
expect(result).toBe(25);

如果我们现在想测试真正的 myMethod,我们无法使用 jest.fn() 将其恢复正常。

间谍的另一件事:

const spy_myMethod = jest.spyOn(component, "myMethod").mockImplementation(() => 25);
const result = myMethod();
expect(result).toBe(25);

现在如果我们想要原始的 myMethod

spy_myMethod.mockRestore();
const result = myMethod();
expect(result).toBe(33);

25
投票

jest.fn()
它是一种创建存根的方法,它允许您跟踪调用、定义返回值等...

jest.spyOn()
来自 jasmine,它允许您将对象上的现有方法转换为间谍,这还允许您跟踪调用并重新定义原始方法实现。

我的经验法则是:如果你想让现有的实现成为间谍,请使用

spyOn
如果你正在构建模拟,请使用
fn()

© www.soinside.com 2019 - 2024. All rights reserved.