Enzyme 与 React Testing Library 的比较

前言

在前端开发中,我们经常需要对我们的代码进行单元测试,以确保功能的正确性和稳定性。React 是目前最流行的前端库之一,针对 React 组件的测试工具也受到了关注。其中,Enzyme 和 React Testing Library 是两个常用的测试库,两者各有优劣。本文将会对 Enzyme 和 React Testing Library 进行详细比较。

Enzyme

Enzyme 是一个 React 组件测试库,由 AirBnB 开发,自动化测试和交互测试框架 Selenium 的设计和思想启发了 Enzyme 的设计。它的主要特点是可以对组件的内部状态和 DOM 的树状结构进行模拟,可以方便地检查组件的输出和交互行为。

安装

Enzyme 支持在 Jest、Mocha、Chai 和 Jasmine 等测试框架中使用。要使用 Enzyme,需要进行安装。首先需要安装 Enzyme 的核心库(enzyme)以及适配器库(enzyme-adapter-react-16)。假设您正在使用 Jest,它们的安装命令如下:

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

示例代码

我们来看一个使用 Enzyme 的示例代码。

假设我们想要测试一个简单的 TodoList 组件,该组件有一个可以添加任务的输入框和任务列表,具体实现如下:

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

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

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

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

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

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

我们可以使用 Enzyme 来测试这个组件的正确性。首先创建测试文件(TodoList.test.js),然后写下以下测试代码:

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

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

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

在第一个测试用例中,我们测试组件是否成功渲染了输入框和按钮。在第二个测试用例中,我们测试了组件的逻辑:当点击按钮时,是否成功添加了新的项目。

这个示例是一个非常简单的例子,但它演示了如何使用 Enzyme 来进行组件测试。

React Testing Library

React Testing Library 的目标是使 React 组件测试更加容易和可靠。相比于 Enzyme,它更加注重测试与用户的交互,而不是测试组件的内部状态和输出。它的思想是,测试中应该关注测试的是组件如何呈现给用户,而不是关注组件的实现细节。

React Testing Library 提供了一系列的 API,可以用来模拟用户的操作、查找元素、断言元素状态等。

安装

React Testing Library 可以与 Jest、Mocha、Chai 和 Jasmine 等测试框架一起使用,需要进行安装。

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

示例代码

我们来看一个使用 React Testing Library 的示例代码。

假设我们有一个与 Enzyme 示例中相同的 TodoList 组件,我们可以使用 React Testing Library 来测试它。首先,在测试文件(TodoList.test.js)中导入组件及相关库:

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

与 Enzyme 的示例代码类似,我们编写两个测试用例:

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

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

第一个测试用例中,我们使用了 getByRole 函数来获取输入框和按钮元素,并断言它们是否存在;第二个测试用例中,我们还是通过 getByRole 函数获取到输入框和按钮元素,但这次我们触发了 change 事件和 click 事件,并使用 getByText 函数断言刚刚添加的任务是否成功。

这个示例与 Enzyme 示例代码的很多部分都相似,但需要注意的是,React Testing Library 更注重与测试运行环境模拟用户行为的一致性,而不是直接模拟组件内部的状态或实现。

对比

通过上面的示例,我们可以看到 Enzyme 和 React Testing Library 可以实现相同的测试场景。那么,它们有什么不同呢?

测试方法

Enzyme 通过 shallowmountrender 等函数来创建组件的虚拟 DOM 树,然后可以选择在虚拟树中查找元素和触发事件,以测试其功能。React Testing Library 使用 render 函数来获取渲染的 DOM 元素,然后使用 getByRolegetByText 等辅助函数查找元素并触发事件。

Enzyme 允许用户在组件实例的生命周期和内部状态变化时进行测试,因此 Enzyme 更注重测试组件的内部实现细节。React Testing Library 则更注重在测试中考虑最终用户交互,对于组件的实现细节不关心,它更注重测试组件的输入和输出。

渲染机制

Enzyme 在测试时会把整个组件、组件的子组件、虚拟 DOM 表示的单个组件都一起渲染在内存中,这样可能会导致测试变得冗长且不可维护,而且开发者必须小心避免不必要的重新渲染。React Testing Library 采用单一的渲染通道,它会对组件进行一次真实的渲染(就像普通用户看到的一样),然后可以获取和操作组件中的节点。

因此,React Testing Library 更适合与 React 生态系统中的其他工具和库集成,它更适合测试组件在浏览器中的实际行为和用户交互。

影响

Enzyme 的发布周期比 React 的长,这意味着它可能不太容易适应 React 16 与 17 中的新功能。React Testing Library 只要在其库的当前发布周期中,就可以应用 React 的新功能。

结论

Enzyme 和 React Testing Library 都是 React 测试库,它们都有自己的使用场景和优缺点。Enzyme 更加关注组件的内部实现细节,并允许用户在多个渲染层级中查找元素。React Testing Library 更注重最终用户的交互,用户使用同样的 API 进行测试,它更适合使用最终大小写的用户事件集成测试。针对不同的场景,选择合适的库是非常重要的。

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


猜你喜欢

  • Promise.allSettled 替代 Promise.all:从 Promise.all() 的坑中脱出来

    Promise.allSettled 替代 Promise.all:从 Promise.all() 的坑中脱出来 当我们使用 Promise.all() 来同时执行多个异步操作时,如果有任意一个操作出...

    4 天前
  • Headless CMS 在物联网领域的应用与创新

    随着物联网技术的不断发展,越来越多的设备和传感器被连接到云端,数据量也随之增加。而 Headless CMS,作为一种新兴的内容管理方式,在物联网领域中也得到了广泛的应用和探索。

    4 天前
  • 优化 Node.js 应用程序性能

    Node.js 是一个非常流行的后端编程语言,可以用于编写高性能的 Web 应用程序。然而,Node.js 的性能也可能成为瓶颈。本文将为您介绍一些优化 Node.js 应用程序性能的技巧和方法,并附...

    4 天前
  • Web Components 中的多语言支持指南

    随着全球化的趋势和人们对多语言支持的需求增加,多语言支持已经成为了各种 Web 应用程序中必不可少的功能。Web Components 是一种让我们可以在一个更加封装、独立的环境中维护多语言的方法。

    4 天前
  • CSS Flexbox 中实现等高布局的方法

    什么是等高布局? 等高布局是指在一个容器中的多个子元素的高度都相等或者至少高度不会超过其他兄弟元素。通常情况下,这些子元素不一定都是一样高的,但是它们的高度需要根据容器自动调整,以便实现一致的外观。

    4 天前
  • AngularJS 中的跨域请求及解决方案

    随着互联网的快速发展,越来越多的 Web 应用程序需要进行跨域请求。然而,由于浏览器的同源策略,使得直接进行跨域请求是无法实现的。AngularJS 框架为我们提供了多种解决方案。

    4 天前
  • ECMAScript 2021:解决字符串格式化引发的问题

    在过去的 JavaScript 版本中,字符串格式化一直是一个问题。在 ECMAScript 2021 中,我们终于得到了解决方案。本文将介绍字符串格式化的历史、问题以及在 ECMAScript 20...

    4 天前
  • GraphQL API - 使用 Prisma 部署实战指南

    GraphQL是一种先进的API设计语言。它的强大之处在于可以根据客户端的需要返回特定的数据。而Prisma则是一款流行的ORM框架,其旨在帮助开发者简单地构建和管理数据库模式与访问数据库。

    4 天前
  • Socket.io 在多浏览器兼容性方面的最佳实践

    随着 Web 技术的不断发展,越来越多的应用需要实时通信的支持。而 Socket.io 是一个非常流行的用于实时通信的库。但是在多浏览器兼容性方面,Socket.io 还有一些需要注意的地方。

    4 天前
  • 优化 CSS Reset 的页面加载速度

    什么是 CSS Reset? 当我们开始编写样式表时,我们需要先让所有浏览器都以相同的方式呈现我们的网页。这就是 CSS Reset 所做的事情。 CSS Reset 是一段特定的 CSS 代码,它重...

    4 天前
  • CSS Grid 布局:如何使用 justify-content 和 align-content 属性?

    CSS Grid 布局是现代网页布局的重要组成部分,它可以帮助我们更有效地分配页面中的空间和位置。在使用 CSS Grid 布局时,我们可以使用 justify-content 和 align-con...

    4 天前
  • 使用 Node.js 和 Winston 进行日志记录:完整指南

    在前端开发中,日志记录是非常重要的一项工作。通过记录日志,开发人员可以追踪应用程序的运行情况,查找错误并进行调试。Node.js 平台上有许多日志记录库可供选择,Winston 就是其中一款非常流行的...

    4 天前
  • RxJS 中的 combineAll 操作符的使用方式及优化

    RxJS 中的 combineAll 操作符的使用方式及优化 RxJS 是一个强大的响应式编程库,以函数式的方法处理异步数据流,可以让前端开发者更方便地处理多个异步请求、事件、定时器等,提供了大量的操...

    4 天前
  • 使用 Next.js 如何进行权限控制?

    权限控制是 Web 应用程序开发中至关重要的一个主题。在商业应用程序中,经常需要特定的用户或用户组才能访问某些页面或功能。拥有错误的权限或者访问未授权的资源可能导致数据泄露或者应用程序安全漏洞。

    4 天前
  • Serverless 架构下的高可用性与伸缩性指南

    什么是 Serverless 架构 Serverless 架构是一种基于云计算的架构模式,它将应用程序从服务器中抽象出来,使得开发者无需关注服务器硬件、操作系统和网络配置等底层细节,只需专注于应用程序...

    4 天前
  • 使用 Mongoose 和 MongoDB 搭建一个 RESTful API

    在前端开发中,使用 Node.js 和 MongoDB 搭建 RESTful API 是很常见的一种情况。而 Mongoose 是一个优秀的 Node.js 的对象模型工具,它可以更好的与 Mongo...

    4 天前
  • 如何在 Mocha 测试框架中进行基准测试?

    Mocha 是一款流行的 JavaScript 测试框架,可用于单元测试、集成测试和端到端测试。除此之外,Mocha 还支持基准测试,可以帮助我们确定代码的性能并进行优化。

    4 天前
  • 响应式设计下的二级菜单最佳实践

    在响应式设计中,为了提供良好的用户体验,设计一个优秀的二级菜单是至关重要的。在本文中,我们将探讨响应式设计下的二级菜单最佳实践,并提供详细的指导和示例代码,以帮助你在你的前端项目中实现高效的二级菜单。

    4 天前
  • ECMAScript 2015 中的 import 和 export 语句的用法详解

    简介 ECMAScript 2015(也称为 ECMAScript 6 或 ES6)是 JavaScript 的一个更新版本,引入了一些新的语法和特性,其中包括 import 和 export 语句。

    4 天前
  • 如何更好地开发 GraphQL API - 初级篇

    GraphQL 是一种用于 API 开发的查询语言和运行时环境。它提供了一种更加高效、强大和灵活的方式来访问和操作数据。在本文中,我们将深入介绍如何使用 GraphQL 更好地开发 API,着重介绍初...

    4 天前

相关推荐

    暂无文章