使用 Enzyme 和 Jest 对 React 组件进行测试

前言

React 是现代 Web 开发中广泛使用的一个 JavaScript 库,它使得构建用户界面变得更加简单。但是,即使你是一个经验丰富的 React 开发者,在构建复杂组件的过程中,也难免出现一些错误和缺陷。这时候就需要使用测试来确保代码的正确性和一致性。本文将向您展示如何使用 Enzyme 和 Jest 对 React 组件进行测试。

简介

Enzyme 是一款 React 组件测试工具,能够模拟 React 组件的行为和结构,并提供了一组用于渲染、遍历和断言的实用函数。Jest 是一个流行的 JavaScript 测试框架,支持快速、简单的测试,能够运行在浏览器环境和 Node.js 环境中。Enzyme 和 Jest 的结合,能够提供强大的测试工具,使得开发高质量 React 组件变得更加容易。

安装

首先,需要安装 Enzyme 和 Jest。打开终端,输入以下命令:

--- ------- ---------- ------ ---- -----------------------
  • enzyme 是 Enzyme 的核心库。
  • jest 是 Jest 测试框架。
  • enzyme-adapter-react-16 是与 React 对应的 Enzyme 适配器.

编写测试

在开始编写测试之前,让我们来了解一下测试驱动开发(TDD)的基本流程:

  1. 编写测试用例(先写测试再写代码)。
  2. 运行测试,测试应该失败,因为代码还没有被编写。
  3. 编写代码。
  4. 运行测试,测试应该通过。
  5. 重构代码(优化代码结构、性能等)。
  6. 重复上述步骤。

现在,假设我们有下面这个简单的 React 组件。

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

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

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

那么我们可以对其进行测试。首先,在同级目录下创建一个叫做 Button.spec.js 的文件。我们来写第一个测试用例:

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

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

这个测试用例的意思是,渲染一个 Button 组件,并检查是否正确地渲染了一个 button 标签,通过查询这个元素的文本内容来验证是否正确渲染了传递给组件的 text 属性值。

在这个测试过程中,我们使用了 shallow 函数来创建一个轻量级的 Button 组件的包装器,该包装器只渲染了组件的第一层元素(也就是 button 元素)。

接下来,我们需要在 package.json 文件中添加以下内容,以便使用 Jest 进行测试:

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

现在,我们可以运行 npm test 命令来运行测试,你应该可以看到测试成功。

使用断言

如果你已经写过一些测试用例了,那么你可能熟悉 expect().toBe() 形式的断言。这是 Jest 中最基本的断言形式。在 Enzyme 中,我们可以使用 expect(wrapper) 作为包装器的查询属性,比如 text()find()hasClass() 等等。

在上面的测试用例中,我们使用了 expect(wrapper.find('button').text()).toBe('Click Me') 作为断言语句。重要的是要测试你的组件的正确性,包括正确地呈现UI元素、正确地处理交互和事件处理程序等等。

测试组件交互

在编写测试用例时,可以模拟用户交互和事件,以验证组件的交互是否正常。我们可以使用 Enzyme 提供的 .simulate 方法来模拟用户进行操作,例如用户点击、输入事件等。例如:

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

这个测试用例的目的是验证组件的点击事件是否被正确地触发,并且组件的状态是否已更改。使用 simulate 方法在包装器上模拟一个点击事件,再次使用断言,确保状况是否已更改。

测试异步函数

测试异步函数时,需要使用 Jest 提供的 asyncawait 语法。例如,下面这个测试异步获取数据的功能:

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

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

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

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

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

使用 Jest 提供的 mockResolvedValue 来模拟一个 API 请求的返回数据,并使用 await 等待数据返回,再使用断言验证数据是否正确地呈现。

总结

本文向您展示了如何使用 Enzyme 和 Jest 对 React 组件进行测试。测试是一个非常重要的开发环节,可以保证代码的正确性和一致性,减少错误和缺陷的发生,同时也可以提高代码的可维护性和可扩展性,帮助开发人员更快地开发出高质量的 React 组件。尝试使用本文提供的示例代码来测试你的 React 组件,并通过 TDD 的方式一步步开发你的项目!

参考

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


猜你喜欢

  • 使用 Socket.IO 实现实时消息推送的完整教程

    在现代互联网应用程序中,实时消息推送已经成为了必备的功能。在这种情况下,Socket.IO 是一种非常流行的实时通信框架,因为它支持实时双向通信,而且可以工作在不同的网络环境下。

    1 年前
  • Vue.js 的生命周期函数

    Vue.js 是一个前端框架,它提供了许多有用的功能,其中之一是生命周期函数。生命周期函数是在 Vue 实例被创建、挂载和销毁时自动调用的方法。这些方法允许我们在不同阶段对应用程序进行操作和处理,例如...

    1 年前
  • Webpack 打包后的代码体积过大怎么办?

    Webpack 打包后的代码体积过大怎么办? 在前端应用的开发过程中,Webpack 已经变成了一个非常受欢迎的打包工具。它可以将各种类型的前端资源打包成几个简单的文件。

    1 年前
  • AngularJS 中的 $location 服务

    什么是 $location? AngularJS 是一种基于 JavaScript 的前端开发框架。它提供了许多服务和指令来简化 Web 应用程序的开发过程。其中一个重要的服务是 $location。

    1 年前
  • PWA请求API服务证书问题解决方案

    在现代的前端应用程序中,越来越多的应用程序需要从服务器端请求数据以提供高品质的用户体验。REST API已成为现代前端开发中最重要的组成部分之一。但是,使用标准 https 协议请求服务端 API 时...

    1 年前
  • PM2 日志管理之日志轮换

    在日志管理中,日志轮换是一个非常重要的功能,主要是为了防止日志文件过大对系统性能造成影响,同时更好地管理日志文件。在 PM2 中,使用日志轮换可以轻松地管理日志文件。

    1 年前
  • MongoDB 数据查询时空间索引问题解析

    在开发中,数据库的查询是一个非常重要的功能。MongoDB是一个非常流行的NoSQL数据库,支持很多种不同类型的查询,其中包括对空间数据的查询。但是,在实际开发过程中,我们常常遇到空间索引的问题。

    1 年前
  • 解决 ES7 中 Object.entries() 在 IE11 下不兼容的问题

    在前端开发过程中,我们经常使用新的 JavaScript 语法和 API,以提高代码的可读性和性能。其中,ES7 中新增的 Object.entries() 方法,能够返回对象中所有成员的键值对数组,...

    1 年前
  • CSS Grid 如何实现自适应的卡片布局

    在网页设计中,常常会需要使用卡片式布局展示内容,如图片、文本等。而采用 CSS Grid 技术可以非常方便地实现自适应的卡片布局,让页面更容易阅读和使用。本文将介绍如何实现这一效果。

    1 年前
  • Babel 7 和 Webpack 4 搭配使用的技巧

    在现代前端开发中,Babel 和 Webpack 是最常用的工具之一。Babel 可以将 ES6+ 的代码转换成浏览器能够识别的 ES5 代码,而 Webpack 可以将多个 JavaScript 文...

    1 年前
  • 如何使用 VirtualBox 优化操作系统性能

    如何使用 VirtualBox 优化操作系统性能 VirtualBox 是一款开源的虚拟机软件,它可以让你在一台物理机上同时运行多台操作系统。使用虚拟机可以让开发人员更加方便地进行应用程序开发和测试,...

    1 年前
  • React 使用 Ant Design 组件时的注意事项

    在前端开发中,使用现有的 UI 组件库可以极大地加快开发速度和提高用户体验。而 Ant Design 是一个极为流行的 UI 组件库之一。在使用 React 框架开发应用程序时,结合使用 Ant De...

    1 年前
  • Redis 之缓存穿透的解决方案

    在前端开发中,缓存可以大大加速页面的访问速度,提高用户的体验。但是,当缓存被攻击者恶意攻击时,就会出现缓存穿透的问题。缓存穿透会导致大量请求落到数据库上,影响系统的性能。

    1 年前
  • GraphQL 常见问题及解决方法

    GraphQL 是一种用于 API 的查询语言和运行时环境,它使得客户端可以精确获取其需要的数据并且避免了多次 API 调用的问题。在前端开发中,GraphQL 已经越来越受到开发者的关注,本文将介绍...

    1 年前
  • 聊聊 ES11 的新特征:浏览器重组比脚本重组更快,废除 Structured Cloning Algorithm

    ES11,全称 ECMAScript 2020,是 JavaScript 的最新标准。它引入了一些新特性,其中包括从 Web Worker 线程中传递非结构化克隆数据的浏览器重组,以及废除 Struc...

    1 年前
  • 解决重置样式的烦恼 —— Normalize.css

    在前端开发中,我们经常遇到一些 cross-browser 的问题,比如不同浏览器对某些标签的默认样式不同,而这些样式可能会影响我们的页面布局和样式实现。为了解决这些问题,我们一般会对样式做 rese...

    1 年前
  • 让你的应用更加美观:Material Design 组件库使用指南

    作为一名前端开发者,让应用变得美观是我们工作中必不可少的一项任务。在这个领域中,Material Design 组件库成为了一个非常受欢迎的选择。它提供了一组现代化的组件和动画效果,可以帮助你为你的应...

    1 年前
  • 如何在 Drupal 8 中实现响应式设计

    Drupal 是一个自由开源的内容管理系统,其稳定性和可扩展性在很多领域都有着广泛的应用。随着移动设备的普及,响应式设计已经成为了现代网站开发的标配之一,而Drupal 8提供了很多有用的工具来实现响...

    1 年前
  • ES12 解决了哪些常见的 JavaScript 误区

    ES12 是 JavaScript 的最新版本,也被称为 ECMAScript 2021。相比于前一个版本 ES11,ES12 引入了很多新的功能和特性,可以帮助开发者更好地写出高效、简洁并且能够克服...

    1 年前
  • 了解 Web 的无障碍体验

    随着数字化时代的来临,Web 已经成为人们获取信息、学习知识、进行交流的主要场所之一。但是,我们也应该为那些视力、听力、身体等方面存在障碍的用户考虑,让他们也能够享受到 Web 带来的便利和乐趣。

    1 年前

相关推荐

    暂无文章