我正在为我的反应项目编写单元测试用例,并使用 jest 和酶来编写测试用例。我已经阅读了开玩笑的文档
https://jestjs.io/docs/en/jest-object.html#jestspyonobject-methodname
其中解释了 jest.spyOn()
方法,但我不完全理解。
所以我想了解更多关于我们应该在哪些地方使用 jest.fn()
以及我们应该/必须在哪些地方使用 jest.spyOn()
的详细信息。如果可以用这两种方法的示例进行解释,那将是一个很大的帮助。
谢谢
我对 react/frontend 项目中这两个函数的简单理解如下:
笑话.fn()
您想模拟一个函数,并且真的不关心该函数的原始实现(它将被 jest.fn() 覆盖)
通常你只是模拟返回值
如果您想在测试中删除对后端(例如调用后端 API 时)或第三方库的依赖关系,这将非常有用
如果您想进行真正的单元测试,它也非常有帮助。您不关心您测试的单元调用的某些功能是否正常工作,因为这不是它的责任的一部分。
jest.spyOn()
该函数的原始实现与您的测试相关,但是:您只想为特定场景添加自己的实现,然后通过 mockRestore() 再次重置它(如果您只是使用 jest.spyOn() 而不进一步模拟它默认情况下它仍会调用原始函数)您只想查看该函数是否被调用...
您只想为特定场景添加自己的实现,然后通过 mockRestore() 再次重置它(如果您只使用 jest.spyOn() 而不进一步模拟它,默认情况下它仍会调用原始函数)
你只想看看函数是否被调用
...
我认为这对集成测试特别有用,但不仅对他们有用!
(好博文:https://medium.com/@rickhanlonii/understanding-jest-mocks-f0046c68e53c)
据我了解,唯一的区别是 您可以使用 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);
jest.fn()
是一种创建存根的方法,它允许您跟踪调用、定义返回值等...
jest.spyOn()
来自 jasmine,它允许您将对象上的现有方法转换为间谍,还允许您跟踪调用并重新定义原始方法实现。
我对此的经验法则是:如果您想让现有的实现成为间谍,请使用 spyOn
如果您正在构建模拟,请使用 fn()
。
jest.spyOn()
时会调用原始方法。请参阅jestjs.io/docs/en/jest-object#jestspyonobject-methodname。