如何在 Jest 中模拟现实世界的依赖项

阅读时长 7 分钟读完

背景

在前端开发中,单元测试是非常重要的一环。而 Jest 是一款流行的 JavaScript 测试框架,其通过提供了丰富的 API 让开发者能够轻松写出高质量的单元测试。

不过,当我们需要测试的代码依赖于其他模块时,就需要模拟这些依赖项的行为,以确保测试代码的准确性和可靠性。

本文将通过几个示例,介绍如何在 Jest 中模拟现实世界的依赖项,并分享一些相关的学习和指导意义。

示例

1. 模拟函数依赖

假设我们有一个 getUserInfo 函数,其依赖于一个名为 request 的异步请求库,并返回一个 Promise,示例代码如下:

为了被测试代码不依赖于真实的 request 库,我们需要模拟这个依赖,以便于在测试时确保 getUserInfo 函数的行为是否正确。

首先我们需要在测试文件中将 request 模块记为 mock 模块:

接着我们需要定义 request 的实际行为:

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

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

----------------------- -- -- -
  ------------ ------ ------- ---- ------ ----- -- -- -
    ----- ------------ - - ----- ------- ---- -- --
    ----------------------------- -- -------------------------------
   
    ----- ------ - ----
    ----- -------- - ----- --------------------
    
    ---------------------------------------
  ---
---
展开代码

上述代码中,我们使用了 Jest 提供的 mockImplementation API,模拟了一个异步函数,并通过使用 Promise.resolve 方法返回一个 mock 数据。这样我们就能在测试中确保 getUserInfo 函数执行的正确性。

2. 模拟对象依赖

假设我们有一个名为 userService 的对象,其提供了一个名为 getUserInfo 的方法,并通过异步请求返回用户信息,示例代码如下:

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

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

------ ----- ----------- - -
  ------------ ----- -------- -- -
    ----- -------- - ----- ---------------------------
    ------ ---------------------
  -
--
展开代码

为了在测试中不依赖于真实的 request 模块,我们需要使用 Jest 的 mock 实现来模拟 userService 对象。

首先我们需要在测试文件中将 userService 对象记为 mock 对象,并为其预设一个 getUserInfo 方法:

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

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

-------------------------- -- -- --
  ------------ -
    ------------ ---------- -- ------------------------------
  -
----
展开代码

然后我们可以编写测试代码:

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

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

----------------------- -- -- -
  ------------ ------ ------- ---- ------ ----- -- -- -
    ----- ------ - ----
    ----- -------- - ----- --------------------------------
    
    -------------------------------------------------------------
    ---------------------------------------
  ---
---
展开代码

在本示例中,我们首先使用了 Jest 的 mock 实现,模拟了 userService 对象;然后预设了一个 getUserInfo 方法模拟真实的结果。

最后,我们使用了 Jest 提供的的 toHaveBeenCalledWith API 来确保被测试的函数 getUserInfo 是否按预期被调用了。

3. 模拟模块依赖

模块如 Lodash、Moment 等在我们的业务逻辑中很常见。在这种情况下,我们需要模拟依赖项。

假设我们有一个名为 getUserName 的函数,其依赖于一个名为 lodash 的模块进行字符串操作,示例代码如下:

为了测试我们的逻辑代码,我们需要使用 Jest mock module 的功能来模拟策略,以更好地与其他逻辑分离。

首先我们需要在测试文件中将 lodash 模块记为 mock 对象:

然后我们可以编写测试代码:

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

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

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

    ------------------------------ ------
    ----------------------------------------------------
  ---
---
展开代码

在本示例中,我们首先将 lodash 模块模拟为具有预设实现的 mock 对象,然后我们使用 Jest 的 toHaveBeenCalledWith API 来确保在调用真实 getUserName 函数时,其调用的 _.capitalize 函数产生了预期的结果。

学习及指导意义

在前端开发中,单元测试是不可避免的,而 Jest 是目前最流行的 JavaScript 测试框架之一,它提供了丰富的 API 和强大的 mock 功能。

当我们需要在 Jest 中模拟现实世界的依赖项时,我们可以采用不同的 mock 策略。这样我们就能够隔离被测代码与代码的依赖项之间的关系,并确保测试代码的准确性和可靠性。

对于前端工程师而言,掌握如何使用 Jest 的 mock 实现来模拟依赖项,将会大大提高代码质量和测试覆盖率。

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

纠错
反馈

纠错反馈