在前端开发中,我们经常需要测试代码,以确保代码的正确性和稳定性。而在测试中,有时我们需要 mock 一些对象的方法来模拟某些场景,以便更好地进行测试。在 Jest 中,我们可以使用 spyOn 方法来轻松地 mock 对象的方法,并跟踪其调用情况。
spyOn 的基本用法
spyOn 方法属于 Jest 的全局方法,可以直接使用。它的基本用法如下:
const obj = { method() { // some code here } }; const spy = jest.spyOn(obj, 'method');
上面的代码中,我们定义了一个对象 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