ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在为我的反应项目编写单元测试用例,并使用 jest 和酶来编写测试用例。我已经阅读了开玩笑的文档

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

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

所以我想了解更多关于我们应该在哪些地方使用 jest.fn() 以及我们应该/必须在哪些地方使用 jest.spyOn() 的详细信息。如果可以用这两种方法的示例进行解释,那将是一个很大的帮助。

谢谢

如果没有足够的答案,请考虑接受答案或询问更多详细信息

y
ysfaran

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

笑话.fn()

您想模拟一个函数,并且真的不关心该函数的原始实现(它将被 jest.fn() 覆盖)

通常你只是模拟返回值

如果您想在测试中删除对后端(例如调用后端 API 时)或第三方库的依赖关系,这将非常有用

如果您想进行真正的单元测试,它也非常有帮助。您不关心您测试的单元调用的某些功能是否正常工作,因为这不是它的责任的一部分。

jest.spyOn()

该函数的原始实现与您的测试相关,但是:您只想为特定场景添加自己的实现,然后通过 mockRestore() 再次重置它(如果您只是使用 jest.spyOn() 而不进一步模拟它默认情况下它仍会调用原始函数)您只想查看该函数是否被调用...

您只想为特定场景添加自己的实现,然后通过 mockRestore() 再次重置它(如果您只使用 jest.spyOn() 而不进一步模拟它,默认情况下它仍会调用原始函数)

你只想看看函数是否被调用

...

我认为这对集成测试特别有用,但不仅对他们有用!

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


值得注意的是,默认情况下,使用 jest.spyOn() 时会调用原始方法。请参阅jestjs.io/docs/en/jest-object#jestspyonobject-methodname
A
Alonad

据我了解,唯一的区别是 您可以使用 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);

f
felixmosh

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

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

我对此的经验法则是:如果您想让现有的实现成为间谍,请使用 spyOn 如果您正在构建模拟,请使用 fn()