Mock 函数在 Jest 中的应用实践

Mock 函数是 Jest 中一种重要的测试工具,可以帮助我们创建虚拟的函数或者模拟现有函数的行为,以便于我们在测试代码的同时避免对真实环境的影响。在前端领域,Mock 函数适用于所有与服务器端交互的场景,包括网路请求、数据库操作、文件读写等等。

Jest 中的 Mock 函数

Jest 中提供了很多种 Mock 函数的实现方式,其中最常用的两种分别是手动 Mock 和自动 Mock。手动 Mock 的方式需要我们自己编写一个 Mock 函数,用于与真实函数进行替换,而自动 Mock 则是 Jest 根据一些特定的规则自动生成一个 Mock 函数。

手动 Mock

手动 Mock 可以通过编写一个与真实函数同名的 Mock 函数实现。例如下面这个函数用于获取用户信息:

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

我们可以编写以下 Mock 函数替换 fetch 函数,以期待测试 getUserInfo 函数的使用情况。

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

通过 Mock 函数,我们使得 getUserInfo 函数可以获得一个固定的用户信息,而不是从真实接口中获取。在测试 getUserInfo 函数时,我们可以通过以下的方式检查函数的正确性:

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

自动 Mock

自动 Mock 则是 Jest 提供的一种强大的 Mock 实现,可以简化 Mock 函数的编写过程。Jest 的自动 Mock 主要根据模块的导出来判断如何进行 Mock,包括模块函数、模块对象、模块类等等。

考虑以下模块文件:

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

我们可以编写一个自动 Mock 如下:

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

这样,在我们引入 user 模块时,Jest 会自动替换为自定义的 Mock 类。

Mock 返回值

在 Jest 中,可以通过 mockReturnValue 或者 mockResolvedValue 方法设置 Mock 函数的返回值。通过这些方法可以将 Mock 函数的行为更加细化,以便于测试更复杂的场景。

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

在这个例子中,我们通过 mockResolvedValue 方法指定了 getUserInfoMock 的返回值。同时,在函数调用之后,我们使用 Jest 提供的工具函数 toHaveBeenCalledWith 来检测 getUserInfoMock 是否被调用。

Mock 模块和导入

在 Jest 中,我们可以通过 jest.mock 来 Mock 整个模块。可以省略手动编写 Mock 函数的过程,直接使用一个虚拟的模块。Mock 一个模块时,我们可以通过 jest.doMock 来替换模块的导入。例如以下代码:

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

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

在这个例子中,我们使用 jest.mock 来提供了一个替代的 Mock User 类。我们通过返回一个包含 MockUser 的对象,替换了对真实模块的引用。在测试代码中,我们可以通过 require 方法来获取到 Mock 模块,并用它创建出我们需要测试的 userService。最终,我们使用 Jest 的匹配器来检查函数的正确性。

更好的 Mock 函数管理

Mock 函数的使用让我们在前端开发的测试环节中,不再受到外部环境的影响。但是,使用多个 Mock 函数进行测试的时候,容易出现大量分散的 Mock 代码,影响了代码的可读性和维护性。因此,如何更好地管理 Mock 函数成为了一个重要的问题。

较佳实践

  1. 把 Mock 函数封装到单独的模块中,减少测试代码的冗余,同时在不同的测试文件中统一使用和管理 Mock 函数。
  2. Mock 函数应该明确其对应的实际模块或者函数,以便我们更好的理解和跟踪其行为。
  3. Mock 函数需要合理的分配测试范围,避免过于宽泛的 Mock 影响正常测试环节的准确性。

Vue 中 Mock 实践

对前后端数据交互的 Mock 是我们前端工程师一个必不可少的技能。例如在 Vue.js 中,我们可以使用 axios 来进行数据请求,而 axios 可以方便的被 Mock,以实现我们的测试需求。以下是一个在 Vue.js 中使用 Mock 函数的实践例子。

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

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

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

在测试代码过程中,我们可以使用 jest.mock 来 Mock 掉 axios 模块,提供自己的 Mock Router:

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

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

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

在这里,我们使用了 axios-mock-adapter 作为 axios 的 Mock 函数库。通过在测试文件中初始化 MockAdapter 并使用它来 Mock 掉 axios,在测试完整的 getUserInfo 函数的过程中,我们不需要依赖真实的服务端,也可以获得我们期望的响应结果。

总结

Mock 函数是 Jest 中非常有用的一个技术,它能够帮助我们轻松实现虚拟的函数以及模块行为,以供我们在测试中使用。手动 Mock 和自动 Mock 是 Mock 实现中最常用的两种方式。在 Mock 函数的管理方面,我们需要合理的分类和作用范围,避免对测试结果造成误导。在实际测试场景中,Mock 函数经常被用在我们前后端数据交互的场景中,可以提供精简、可靠的测试代码,加速开发过程,提升代码质量。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/652fb6067d4982a6eb0e552b


猜你喜欢

  • 理解 ECMAScript 2019 中的空对象协议并在 JavaScript 应用程序中使用它

    在 ECMAScript 2019 中,定义了一个新的空对象协议(nullish coalescing operator),它可以帮助开发者更简洁地处理值为 null 或 undefined 的情况。

    1 年前
  • 使用 Enzyme 进行 React Native 组件测试时遇到的 “Alert.alert is not a function” 问题的解决方式

    背景 在进行 React Native 组件测试时,我们经常会使用 Enzyme 这个测试工具。Enzyme 提供了一些方便的 API,可以轻松地模拟 React 组件的渲染、交互等行为,进而实现组件...

    1 年前
  • 一次排除 PM2 进程崩溃不启动的问题

    在开发过程中,经常会用到 PM2 这样的工具来管理 Node.js 进程。通常情况下,PM2 是一个非常稳定和可靠的工具,但是有时候,PM2 进程可能会出现崩溃不启动的问题,这是一件非常让人头疼的事情...

    1 年前
  • Redis 慢查询日志详解及优化方案

    前言 Redis 是一种轻量级的内存数据库,适用于快速存储和读取键值对。但是,在高并发的场景下,Redis 的性能可能会降低,导致慢查询。如何找出这些慢查询,并通过优化来提高 Redis 的性能呢?本...

    1 年前
  • Kubernetes 集群中 RBAC 的使用及权限分配

    引言 Kubernetes 是一种高度可扩展的开源容器编排平台,它被广泛用于构建、部署和管理容器化应用程序。在 Kubernetes 集群中,kubectl 命令行工具和 API 是授权访问集群资源的...

    1 年前
  • PWA 技术实现的数据存储优化方法,提高应用数据的存储效率

    随着移动设备的普及,Web 应用程序也开始受到更多的关注和重视。PWA 技术(Progressive Web App),是指一种可以提供类似于原生应用程序体验的 Web 应用程序。

    1 年前
  • Koa.js 中间件实现原理详解

    Koa.js 是一款优秀的 Node.js Web 框架,它采用了中间件机制来进行请求处理。它的中间件机制非常灵活,可以非常方便的进行流程控制、错误处理以及性能优化等操作。

    1 年前
  • Flask Restful API 中如何实现 Token 认证

    在开发 Web 应用程序时,身份验证是重要的、必须的步骤。其中,Token 认证是一种相对简单的方式来认证用户身份,并且在 Web 开发中非常流行。Flask Restful 是一个基于 Flask ...

    1 年前
  • Vue.js 中使用 provide 和 inject 共享数据的方法

    在 Vue.js 中,如果多个组件需要共享同一些数据,我们可以通过父子组件传递 props、通过 vuex 进行状态管理或者使用 Vue.js 提供的 provide 和 inject。

    1 年前
  • SASS 中使用 “@for” 创建循环时出现错误应该如何解决?

    SASS 中使用 “@for” 创建循环时出现错误应该如何解决? SASS 是一种 CSS 预处理器,可以让开发者写出更加优美、高效的 CSS 代码。其中,@for 是 SASS 中比较常用的创建循环...

    1 年前
  • Cypress 自动化测试中关于 iframe 处理的技巧及完美解决策略

    在前端自动化测试中,经常会遇到与 iframe 相关的问题。在 Cypress 自动化测试中,处理 iframe 问题的技巧和策略尤为重要。本篇文章就为大家提供了一些有深度、有学习和指导意义的技巧和解...

    1 年前
  • 如何使用 CSS Reset 解决网站内部样式的问题

    如何使用 CSS Reset 解决网站内部样式的问题 在前端开发中,经常会遇到一些样式问题,比如在不同的浏览器中,同一元素的样式会有所不同,甚至在同一浏览器中,不同网站的样式也会有差别。

    1 年前
  • 如何使用 Chai 和 Mocha 对套接字进行测试

    在前端领域开发套接字的应用程序是一个比较普遍的需求,而如何对其进行测试则是我们需要掌握的一项技能。在本文中,我们将介绍如何使用 Chai 和 Mocha 来测试套接字应用程序。

    1 年前
  • 使用 Server-Sent-Events 和 Django 进行实时性通信

    什么是 Server-Sent-Events? Server-Sent-Events (SSE) 是一种基于 HTTP 的协议,用于服务器向客户端推送实时事件流。SSE 通过一个单向连接,服务器可以向...

    1 年前
  • 在使用 Jest 测试框架时,如何 mock 异步组件

    随着前端技术的不断发展,测试也变得越来越重要。在前端开发中,测试框架 Jest 已成为一个备受欢迎的选择。在 Jest 中,我们可以方便地进行单元测试、集成测试、快照测试等各种测试工作。

    1 年前
  • Serverless 如何统计 API 请求日志?

    近年来,以 Serverless 架构为代表的云原生应用架构,得到了越来越多的关注和实践。Serverless 架构的一大特点就是无服务器化,它让我们无需再关注服务器的管理和配置,只需专注于业务逻辑的...

    1 年前
  • 如何在 TypeScript 中使用 React 表单

    随着前端技术日新月异,TypeScript与React已经成为了当前最受欢迎的技术。React作为一个JavaScript库,已经成为一个构建界面的热门选择。而TypeScript则为JavaScri...

    1 年前
  • Docker 容器的自动重启策略配置方法

    Docker 容器的自动重启策略配置方法 在前端开发的过程中,我们通常会使用 Docker 来部署我们的应用程序。在 Docker 中,我们经常需要配置容器的自动重启策略,以保证应用程序在出现异常情况...

    1 年前
  • 使用 Web Components 实现可拖拽排序功能的教程

    前言 随着 Web 技术的不断发展,开发者们有了越来越多的选择。Web Components 作为构建可复用定制化组件的标准,早已经被广泛应用在各类应用程序中。本文将向大家介绍如何使用 Web Com...

    1 年前
  • Express.js 应用开发的 TLS 部署实践

    随着互联网时代的不断发展,安全问题愈加重要。而在前端开发中,TLS(Transport Layer Security)则是保证数据安全的重要手段之一。本文将介绍如何在 Express.js 应用开发中...

    1 年前

相关推荐

    暂无文章