Jest mock 和 Stub 规范

阅读时长 5 分钟读完

在前端开发中,单元测试是非常重要的一环。而 Jest 是一个流行的测试框架,它提供了多种类型的模拟,包括 mock 和 stub。模拟是一种模拟函数行为的技术,以便在测试过程中确定功能是否正确。本文将介绍 Jest 中的 mock 和 stub 规范。

Mock

Mock 是 Jest 提供的一种测试技术,可以替换掉一个函数的真实实现。Mock 通常用来模拟外部依赖,如接口调用、数据库访问、文件读写等等。通过使用 Mock,我们可以控制函数的行为,确保测试的不受外部环境的影响。

创建 Mock

在 Jest 中,我们可以通过 jest.fn() 方法创建 Mock,示例如下:

创建了一个空函数,我们可以通过 fn.mock 属性来访问 mock 信息。该属性会返回一个包含许多键值对的对象,常用的有 fn.mock.callsfn.mock.resultsfn.mockImplementation

  • fn.mock.calls 包含测试函数每次被调用的参数列表,可以使用 expect(fn.mock.calls).toHaveLength(count) 检查函数的调用次数。

  • fn.mock.results 包含 mock 的执行结果。如果 mock 未执行,则结果为 undefined。

  • fn.mockImplementation 可以传入一个函数,这个函数会替换掉原函数的实现。

使用 Mock

我们可以通过下面的方法,将 Mock 应用于代码中:

例如,我们需要测试一个名为 getUser 的方法,该方法依赖于外部接口进行调用,示例如下:

在测试中,我们可以使用 Mock 替换掉 axios 的真实实现。示例如下:

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

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

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

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

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

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

在这里,我们使用 jest.mock('axios') 来替换掉 axios 模块,axios.get 的真实实现将被 Mock 替换。然后,使用 mockResolvedValue 方法来定义 Mock 的执行结果。

Stub

Stub 是 Jest 提供的另一种测试技术,它可以用于替换函数的实现,从而控制函数的返回结果。Stub 常用于测试复杂的业务逻辑,以保证代码正确性和可维护性。

创建 Stub

在 Jest 中,我们可以使用 jest.spyOn 方法来创建 Stub。该方法会返回一个实例对象,我们可以设置返回结果或替换掉函数的实现。示例如下:

这里我们创建了一个实例 spyObj,它是对 obj.method 的一个 Stub。我们可以使用 spyObj.mock 设置、访问 Stub 的相关信息。

使用 Stub

在测试代码中,我们可以使用 Stub 替代原函数,来方便测试业务逻辑的正确性。示例如下:

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

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

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

在这个例子中,我们首先使用 jest.spyOn 创建了一个 Stub,然后设置了返回值为 42。在测试例子中,我们调用 obj.method,会返回 42,同时也会使 Stub 记录下自己已经被调用,并在测试结束后可以通过 mock.calls 来验证。

总结

在本文中,我们学习了 Jest 中的 mock 和 stub 规范。Mock 可以帮助我们对外部依赖进行模拟,而 Stub 可以方便地控制函数的返回值。我们可以通过使用这两种技术,来保证代码的正确性和可维护性。在实际开发中,我们应该根据实际情况进行选择,准确使用这两种模拟技术。

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

纠错
反馈