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

时间:2019-08-25 06:39:55

标签: reactjs mocking jestjs spy

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

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

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

因此,我想了解有关应该使用jest.fn()的特定位置以及应该/必须使用jest.spyOn()的特定位置的更多详细信息。如果可以通过两种方法的示例进行说明,将会有很大帮助。

谢谢

3 个答案:

答案 0 :(得分:4)

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

jest.fn()

  • 您想模拟一个函数,而实际上并不关心该函数的原始实现
  • 通常,您只是在模拟返回值
  • 如果您要在测试中删除对后端(例如,调用后端API时)或第三方库的依赖项,这将非常有用
  • 如果要进行真实单元测试,它也非常有用。您不必担心被测试单元调用的某些功能是否正常工作,因为那不是其职责的一部分。

jest.spyOn()

  • 该功能的原始实现与您的测试有关,但是:
    • 您只想为特定情况添加自己的实现,然后通过mockRestore()再次重置它
    • 您只想查看函数是否被调用
    • ...
  • 我认为这对集成测试特别有用,但不是仅对他们有用!

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

telethon.sync是一种创建存根的方法,它将允许您跟踪调用,定义返回值等。

茉莉花上的

jest.fn()凸轮,它可以将对象上的现有方法转换为间谍,还可以跟踪调用并重新定义原始方法的实现。

我的经验法则是:如果要使现有的实现成为间谍,请使用jest.spyOn()。如果要构建模拟,请使用spyOn