利用 Enzyme 测试 React Hooks 的最佳实践

在前端开发中,React Hooks 是一种非常流行的编写组件逻辑的方式,它们能够提供一个简单和更好的方式去管理状态和交互。随着 React Hooks 的日益流行,有必要编写一些测试来确保代码的质量和稳定性。目前最主流的 React 测试工具框架是 Enzyme,因此本文将介绍如何使用 Enzyme 测试 React Hooks 的最佳实践。

关于 Enzyme

Enzyme 是由 Airbnb 开发的 React 测试工具框架,它提供了一个友好的 API 来测试 React 组件的输出。它支持 3 种渲染方式:mount、shallow、render。其中 mount 是真实渲染,也叫深度渲染,shallow 是浅渲染,render 是静态渲染。

在本文中,我们将使用 mount 来进行渲染,因为 mount 的优势在于它会渲染组件的所有子组件,并返回它们在树中的位置。这些数据可以帮助测试人员更好地了解组件的输出和交互。

准备工作

在开始我们的实践之前,我们需要先确保我们的开发环境中已经安装了 Enzyme 和它所依赖的 React Adapter。在这里我们选择 React 17 作为适配器。

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

接下来,创建 src/setupEnzyme.js 文件,初始化 Enzyme,并使用 React 适配器。

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

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

最后在 Jest 配置中引入它:

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

Hook 测试的结构和策略

Hooks 的测试策略会稍微有点不同。在使用 React 类组件时,我们可以通过 ref 直接实例化组件,以便进行测试。但是,使用 Hook 时,我们没有像 ref 那样可以访问组件实例的方式,因为它只是一个函数。所以,要测试 Hook,我们需要渲染一个包含 Hook 的组件,并在 Hook 挂载时断言。

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

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

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

在这个例子中,我们使用 mount 渲染 CustomComponent,当 CustomComponent 组件渲染时,useCustomHook 会被调用然后返回它应该返回的值。然后我们通过在 wrapper 中查找包含字符串 'trigger-custom-hook' 的元素来得到真实的 Hook 返回值。

示例代码

最后,我们来看一个示例,演示如何使用 Enzyme 测试 React Hooks 的最佳实践。本例子是一个简单的轮播图组件,它使用 useState 和 useEffect 实现。以下是 Hook 代码:

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

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

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

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

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

在我们的测试中,我们将渲染包含轮播的组件,并确保它可以正常渲染和工作。

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

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

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

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

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

如上所示,我们通过 jest.useFakeTimers()模拟了需要等待时间,然后更新 wrapper 并断言不同的渲染状态来测试 Hook 的工作方式。

总结

从上述实践中我们可以总结出一些最佳实践:

  1. 在使用 Hooks 时,需要渲染 Hook 所在的组件。
  2. 通过选择 mount 来渲染并测试整个组件。
  3. 在测试之前需要准备好 Enzyme 函数和 React Adapter。
  4. 使用 Jest 的定时器 API 来测试延迟的 Hook。

希望使用本文后 Enzyme 测试 Hook 变得更轻松。这个过程可能比直接测试 Class Component 要繁琐一些,但在确保 Hooks 的正确性和性能中是必不可少的一步。在学习了如何测试 Hook 后,我们将更容易编写可维护的,具有高质量的组件。

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


猜你喜欢

  • React 组件复用技巧:使用 Higher Order Component(HOC)

    React 是一种流行的 JavaScript 前端库,它允许开发人员以声明式方式构建用户界面。在 React 中,组件是一种重要的概念,它允许开发人员将应用程序划分为可组合的部分。

    1 年前
  • Headless CMS 解决多站点管理问题

    随着公司业务的不断扩展和发展,多站点管理的需求也越来越迫切。不同的产品线需要面向不同的市场,并且需要传达不同的信息,因此如何管理多个站点变得非常重要。传统的 CMS(内容管理系统)虽然能够满足一些基本...

    1 年前
  • Cypress 测试实战:如何用 Cypress 进行复杂表单测试

    前言 在前端开发中,我们经常会遇到需要测试复杂表单的情况。传统的测试方法可能需要手动去填写表单并观察结果,这种方法费时费力且容易出错,而 Cypress 正好提供了一种更加高效、智能的测试方案。

    1 年前
  • SASS 中 HSL/RGB 颜色转化的技巧

    在前端开发中,颜色是不可或缺的元素。为了更好地管理颜色,在 CSS 预处理器中,我们经常使用 HSL 和 RGB 色彩模型。在 SASS 中,它们的使用也很普遍。但是,有时候我们需要在 HSL 和 R...

    1 年前
  • SSE 的原理及在实际项目中的应用

    SSE (Server-Sent Events) 是一种基于 HTTP 协议的服务器推送技术,它可以实现服务器向客户端主动推送数据的功能。SSE 在前端实时通信中发挥着至关重要的作用,例如在线聊天、股...

    1 年前
  • 在 Node.js 中使用 Docker 进行应用部署的实践与总结

    随着互联网技术的不断发展,现代化的软件开发与部署方式已经从传统的物理机部署转向了虚拟化技术。Docker 作为一种常见的虚拟化工具已经越来越普及,它不仅能够提供高效的容器化技术,还能够为应用程序部署提...

    1 年前
  • 在 React 中更好地使用 TypeScript: 函数式组件篇

    在 React 中更好地使用 TypeScript: 函数式组件篇 React 是一种极具表现力的 JavaScript 库,它为开发人员提供了一种先进的可重用 UI 组件的方法。

    1 年前
  • Redux 的中间件使用姿势详解

    Redux 是一个流行的前端状态管理库,可以用于管理复杂应用程序的状态。Redux 自带了许多中间件,它们可以扩展 Redux 的功能和能力。本文将详细讲解 Redux 中间件的使用方法,包括中间件的...

    1 年前
  • 如何在 Express.js 中实现 CORS 跨域请求

    什么是跨域请求 在 Web 应用程序中,当来自一个域(网站)的 JavaScript 代码试图访问另一个域的资源时,就会出现跨域请求。这是由于浏览器的同源策略造成的,这个策略要求客户端 Web 应用程...

    1 年前
  • Redis 的 Hyperloglog 数据结构及应用实例

    Redis 是一个非常流行的开源内存数据存储,它支持各种数据结构,例如字符串、哈希、列表、集合等等。其中一个有趣的数据结构是 Hyperloglog,它可以非常有效地统计一个集合中独立元素的个数。

    1 年前
  • Next.js 解决静态资源缓存问题

    引言 在前端技术栈中,许多项目都会引入各种静态资源,包括但不限于图片、CSS、JS、字体等。为了提高用户体验及加快资源加载速度,前端工程师们通常采用各种方式进行优化。其中,缓存技术常常被用到。

    1 年前
  • 基于 Kubernetes 的 CI/CD 方案

    在现代化的软件开发中,CI/CD(Continuous Integration/Continuous Deployment)已经成为必不可少的部分。而 Kubernetes 作为一个高度可扩展的容器编...

    1 年前
  • Mongoose 中使用索引的方法及常见错误

    在 Node.js 的 Web 开发中,使用 MongoDB 作为数据库是非常常见的选择,而在使用 MongoDB 时,Mongoose 是 Node.js 的一个非常好用的 ODM(Object-D...

    1 年前
  • Enzyme 测试中如何使用 Shallow 和 Full DOM 模式

    Enzyme 测试中如何使用 Shallow 和 Full DOM 模式 在前端开发中,测试是一个非常重要的步骤。它可以帮助我们找出程序代码中的问题,提高程序的质量和稳定性。

    1 年前
  • 使用 Flexbox 布局实现复杂的多列排版

    Flexbox 是一个用于布局的 CSS3 模块,它可以极大地简化前端开发者的工作。在这篇文章中,我们将讨论如何使用 Flexbox 实现复杂的多列排版。 什么是 Flexbox? Flexbox 可...

    1 年前
  • Angular 中如何实现图片懒加载

    在 Web 开发中,图片懒加载是非常常见的技术,其主要目的是优化页面加载速度和用户体验,以及节约带宽。它能够使得页面在浏览器滚动到可视区域时再加载图片,而不是在页面一开始就加载所有的图片。

    1 年前
  • PM2 自定义日志输出格式设置

    在前端开发中,日志输出是一个非常重要的环节。PM2 是一个常用的 Node.js 进程管理器,它可以协助我们管理 Node.js 的进程。PM2 自带了日志输出功能,可以将应用程序的日志输出到控制台或...

    1 年前
  • ECMAScript 2021:了解 RegExp Match Indices 新特性 ...

    ECMAScript 2021:了解 RegExp Match Indices 新特性 在 ECMAScript 2021 新特性中,RegExp Match Indices(匹配索引)是一个非常有趣...

    1 年前
  • LESS 编写 CSS 动画的技巧及实战案例

    LESS 是一款 CSS 预处理器,它可以将简单的 CSS 扩展为更强大、更灵活的样式语言。而在 LESS 中,我们可以更轻松地创建 CSS 动画。本文将介绍 LESS 编写 CSS 动画的技巧与实战...

    1 年前
  • GraphQL 在 Java 中的应用

    GraphQL 是一种查询语言和运行时解释器,它可以让客户端通过一个 API 来获取到需要的数据。相对于 RESTful API,GraphQL 更加灵活,具有更小的网络开销和更好的类型检查。

    1 年前

相关推荐

    暂无文章