jest.fn 和 jest.spyOn 有什么区别?

阅读时长 3 分钟读完

在前端开发中,单元测试是非常重要的一部分。Jest 是一个非常流行的 JavaScript 测试框架,它提供了许多有用的函数和工具来帮助我们编写高质量的测试代码。在 Jest 中,有两个非常常用的函数:jest.fn()jest.spyOn()

jest.fn()

jest.fn() 是一个可以用来创建一个模拟函数的函数。模拟函数是一个在测试中替代真实函数的函数,它可以被用来验证函数被调用的次数、参数等信息。这个函数可以接受任何参数,并且可以返回任何值。

以下是一个示例:

在这个示例中,我们创建了一个名为 mockFn 的模拟函数,并且调用了两次。我们可以通过 mockFn.mock.calls 属性来获取函数的调用信息,该属性是一个数组,其中每个元素都包含了函数调用时传递的参数。

jest.spyOn()

jest.spyOn() 函数是一个更加高级的函数,它可以用来监视一个对象的方法。当我们使用 jest.spyOn() 函数来监视一个对象的方法时,Jest 会创建一个模拟函数来替代真实的方法。这个模拟函数会记录所有的调用信息,并且可以被用来验证函数是否被调用、调用次数、参数等信息。

以下是一个示例:

-- -------------------- ---- -------
----- --- - -
  ------ -- -
    ------ - - --
  -
--

----- --- - --------------- -------

---------------------- ----
-- ------- -

----------------------------
-- ------- - - -- - - -

在这个示例中,我们创建了一个名为 obj 的对象,并且监视了它的 add 方法。我们调用了 obj.add(1, 2) 方法,并且通过 spy.mock.calls 属性来获取函数的调用信息。

区别

虽然 jest.fn()jest.spyOn() 都可以用来创建模拟函数,但是它们之间有一些重要的区别:

  • jest.fn() 可以用来创建一个独立的模拟函数,而 jest.spyOn() 只能用来监视一个对象的方法。
  • jest.fn() 返回的是一个完全独立的模拟函数,而 jest.spyOn() 返回的是一个与真实函数相关联的模拟函数。
  • jest.fn() 可以用来创建一个新的函数,并且可以传递任何参数,而 jest.spyOn() 只能用来监视已经存在的函数。

总结

在 Jest 中,jest.fn()jest.spyOn() 都是非常有用的函数,它们可以帮助我们编写高质量的测试代码。虽然它们之间有一些区别,但是它们都可以用来创建模拟函数,并且可以被用来验证函数的调用信息。在实际开发中,我们需要根据具体的情况来选择使用哪个函数。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/655ac0c7d2f5e1655d4f4d63

纠错
反馈