Jest 中的 spyOn:如何 mock 对象的方法并跟踪其调用

在前端开发中,我们经常需要测试代码,以确保代码的正确性和稳定性。而在测试中,有时我们需要 mock 一些对象的方法来模拟某些场景,以便更好地进行测试。在 Jest 中,我们可以使用 spyOn 方法来轻松地 mock 对象的方法,并跟踪其调用情况。

spyOn 的基本用法

spyOn 方法属于 Jest 的全局方法,可以直接使用。它的基本用法如下:

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

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

上面的代码中,我们定义了一个对象 obj,其中包含一个名为 method 的方法。我们可以使用 spyOn 方法来 mock 这个方法,并创建一个 spy 对象来跟踪其调用情况。

spy 对象有多个方法可以使用,其中最常用的是 mockImplementation 和 mockReturnValue。它们分别可以用来 mock 方法的实现和返回值。例如:

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

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

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

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

上面的代码中,我们使用 mockImplementation 方法来 mock method 方法的实现,并将其返回值设为 'mocked'。此时,调用 obj.method() 方法会输出 'mocked'。

跟踪方法的调用情况

除了 mock 方法的实现和返回值外,spy 对象还可以用来跟踪方法的调用情况。它提供了一系列方法,可以用于检查方法是否被调用、调用了多少次、以及传递给方法的参数等信息。

检查方法是否被调用

使用 spy 对象的 toHaveBeenCalled 方法可以检查方法是否被调用过。例如:

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

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

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

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

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

上面的代码中,我们使用 toHaveBeenCalled 方法来检查 spy 对象是否被调用过。在第一个 expect 中,我们期望 spy 对象没有被调用过;而在第二个 expect 中,我们期望 spy 对象被调用过。

检查方法被调用的次数

使用 spy 对象的 toHaveBeenCalledTimes 方法可以检查方法被调用的次数。例如:

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

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

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

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

上面的代码中,我们使用 toHaveBeenCalledTimes 方法来检查 spy 对象被调用的次数。在这个例子中,我们调用了两次 obj.method() 方法,因此期望 spy 对象被调用了两次。

检查方法被传递的参数

使用 spy 对象的 toHaveBeenCalledWith 方法可以检查方法被传递的参数。例如:

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

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

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

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

上面的代码中,我们使用 toHaveBeenCalledWith 方法来检查 obj.method() 方法被传递的参数。在这个例子中,我们期望 obj.method() 方法被传递了参数 1、2 和 3。

总结

Jest 中的 spyOn 方法可以用来 mock 对象的方法,并跟踪其调用情况。我们可以使用 spy 对象的多个方法,来检查方法是否被调用、调用了多少次,以及传递给方法的参数等信息。这些功能可以帮助我们更好地进行测试,提高代码的质量和稳定性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/662d8e40d3423812e4b12b63