Jest 如何打造更完善的 Mock 数据?

阅读时长 6 分钟读完

在前端测试中,Mock 数据是非常重要的一部分,因为它能够模拟真实数据给测试带来更加真实的场景,同时也可以减少测试对后端的依赖。在 Jest 中,我们可以非常简单地实现 Mock 数据的使用,并且还可以通过一些高级用法打造更加完善、准确的 Mock 数据,让我们来一起看看吧。

基本使用

在 Jest 中,我们可以通过 jest.mock() 方法快速实现 Mock 数据的使用,这个方法可以接受两个参数,第一个参数是需要 Mock 的模块路径,第二个参数是一个 Mock 对象。例如我们有一个 utils.js 模块,它里面包含了一个 getName() 方法,我们想要测试一个依赖 getName() 方法的模块 getUserInfo.js ,我们可以这样来进行 Mock:

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

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

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

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

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

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

可以看到,我们在测试 getUserInfo.js 模块时,通过 jest.mock() 方法将 getName() 方法 Mock 掉了,它在测试时返回 '李四' 而不是实际的 '张三',因此我们在测试中可以轻松地测试 getUserInfo() 方法的正确性。

这是基本的 Mock 数据使用方法,接下来,我们可以通过一些高级用法打造更加完善的 Mock 数据,优化测试效果。

Mock 实现

在 Jest 中,我们可以通过 Mock 实现来对 Mock 数据的行为进行更加灵活的控制,它可以让我们实现一些定制的逻辑,从而更符合我们测试的需求。

Mock 实现可以通过 jest.fn()、jest.mockImplementation() 和 jest.fn().mockImplementation() 等方法来实现,它们分别适用于函数 Mock 和模块 Mock,这里我们以函数 Mock 为例进行讲解:

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

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

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

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

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

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

可以看到,在上面的例子中,我们使用 jest.fn() 来 Mock 了一个加法函数 add ,并且在调用 mockAdd() 函数时,可以通过 mockAdd.mock.calls 来获取它的调用历史,通过这些属性和方法,可以使我们的 Mock 实现更加灵活,打造出更多样化、符合测试需求的 Mock 数据。

Mock 类

在某些情况下,我们需要 Mock 的不仅仅是一个函数或一个模块,而是一个类,这时我们就需要使用 jest.createMockFromModule() 或者 jest.mock() 来创建一个模块 Mock。

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

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

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

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

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

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

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

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

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

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

在上面的例子中,我们 Mock 了一个 MyArray 类,它的实例将在调用时返回一个拥有 push 方法和 length 属性的对象,然后我们测试了一个继承自 MyArray 类的 MyAsyncArray 类,还使用了它的 pushAsync 方法进行测试。

可以看到,使用 jest.mock() 来 Mock MyArray 时,我们返回的是一个对象,mockImplementation 中返回的就是这个对象,只是其中的 push 方法被 Mock 了,这样就可以让测试更加专注于隔离的测试,而不是依赖于外部的环境,确保测试的正确性。

总结

在 Jest 中,Mock 数据是非常重要的一部分,在测试中起到了至关重要的作用,而打造更加完善、准确的 Mock 数据则需要我们对 Jest 中的 Mock 机制有一定的理解和把握,通过不断实践和经验积累,我们可以更加优秀地编写测试,从而保障项目的质量。

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

纠错
反馈