Jest 测试 React 组件的最佳实践

Jest 是一个 Facebook 推出的开源 JavaScript 测试框架。它是 React 官方推荐的测试工具之一。在前端开发中,我们常需要测试 React 组件,这篇文章将介绍 Jest 测试 React 组件的最佳实践,帮助你写出高质量的测试代码。

安装 Jest

使用 Jest 测试 React 组件需要安装 Jest。可以使用 npm 进行安装:

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

编写测试用例

Jest 的测试用例被称为“测试套件(test suite)”。每个测试套件包含一个或多个“测试用例(test case)”,每个测试用例都是一个独立的测试。一个测试用例应该只专注于测试一个特定的行为。

一个最简单的 React 组件测试用例如下:

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

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

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

首先,我们导入 React@testing-library/react 库。然后,定义了一个简单的组件 Button,它接收一个 label 属性和一个 onClick 回调函数。这个组件只是一个简单的按钮,当点击按钮时,将会调用传入的 onClick 回调函数。

然后,我们在一个测试套件中编写了一个测试用例。这个测试用例使用了 Jest 提供的 render 函数,渲染了 Button 组件,并使用 getByText 函数获取了按钮组件。最后,我们使用了 expect 断言,判断按钮是否被渲染到了文档中。

深度渲染(Deep Rendering)

在测试 React 组件时,我们通常需要对组件进行深度渲染(deep rendering),即渲染组件的所有子组件直到最后一个节点。深度渲染能够更好地模拟组件在实际应用中的行为。

在 Jest 中,我们可以使用 mount 函数来进行深度渲染。这个函数在 @testing-library/react 库中并不存在,我们可以使用 enzyme 库的 mount 函数来代替它。

安装 enzyme

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

配置 enzyme

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

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

在测试文件中使用 mount 函数进行深度渲染:

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

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

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

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

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

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

在这个测试用例中,我们编写了一个简单的表单组件 Form。这个组件接收一个 onSubmit 回调函数,当表单提交时,将会调用这个回调函数并将输入框的值作为参数传递到它里面。

我们使用 mount 函数来进行深度渲染,并使用 find 函数查找输入框和表单元素。然后,我们修改了输入框的值,模拟表单提交,并使用 toHaveBeenCalledWith 断言判断 handleSubmit 是否被调用,并且调用参数是否正确。

异步测试

在测试 React 组件时,我们经常需要测试异步行为,比如组件的 fetch 请求等。在 Jest 中,我们可以使用 asyncawait 关键字来测试异步行为。

下面是一个使用 asyncawait 测试异步请求的例子:

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

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

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

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

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

在这个测试用例中,我们渲染了 App 组件,然后使用 screen 对象查找了加载中的文本。接下来,我们使用 waitFor 函数等待组件加载完成,并使用 await 关键字等待异步函数完成。最后,我们检查加载中的文本是否已经消失以及是否显示了正确的文本。

mock 函数

在测试 React 组件时,有时我们需要测试组件内部的函数调用或者外部 API 的调用。为了避免测试中的副作用和不确定性,我们可以使用 Jest 提供的 mock 函数来模拟这些调用。

下面是一个模拟外部 API 调用的例子:

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

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

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

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

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

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

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

在这个测试用例中,我们使用了 Jest 提供的 jest.mock 函数来模拟 axios 模块,使用 mockResolvedValue 函数模拟 get 方法的返回值。然后,我们测试了组件是否正确显示了从 API 中获取的数据。

总结

在本文中,我们介绍了 Jest 测试 React 组件的最佳实践,包括编写测试用例、深度渲染、异步测试和 mock 函数。使用这些技术能够帮助你写出高质量的测试代码,并提高项目的可靠性和可维护性。

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


猜你喜欢

  • Promise 的捕获错误方式(try-catch vs catch())

    Promise 是一种非常方便的异步编程方式,它可以使代码更加清晰、简洁、易于维护。但是在使用 Promise 的过程中,我们也需要注意错误的处理和捕获。在这篇文章中,我们将探讨 Promise 的错...

    5 个月前
  • ES9 中的 Object Rest/Spread Properties:JavaScript 对象实用说明

    ES9 (ECMAScript 2018)是 JavaScript 语言的一个重要版本更新,在这个版本中,除了新增了一些语言特性外,也对一些已有的语言特性进行了完善和优化。

    5 个月前
  • 使用 GraphQL 和 Neo4j 构建服务

    在当前的 Web 开发领域中,随着前端技术的快速发展,很多厂商都推出了自己的前端框架,例如 React、Vue、Angular 等。但是,这些框架只是实现了前端和用户交互的功能,而后端结构的搭建和管理...

    5 个月前
  • Hapi 中如何使用 Joi 进行输入验证

    在编写 Web 应用程序时,输入验证是非常重要的一环。如果您的应用程序接受的输入数据不正确,将很容易受到各种攻击,例如 XSS 或 SQL 注入等。因此,我们需要使用强大而可靠的输入验证工具来确保应用...

    5 个月前
  • webpack chunk 中包含多个 entry 的方案

    当我们构建前端应用时,打包工具 webpack 是不可或缺的。webpack 不仅可以将多个文件打包成一个文件,而且还可以支持按需加载(code splitting)和按照模块的依赖关系异步加载模块(...

    5 个月前
  • PM2 如何与 Express 配合使用

    前言 对于前端工程师而言,常常需要一种可靠的工具来进行进程管理,能够快速启动、停止或重启应用程序,并支持日志记录和监测等功能。而 PM2 正好可以胜任这样的任务。另外,Express 是一个受欢迎的 ...

    5 个月前
  • 如何在 Koa 中使用 passport 进行认证

    在现代网络应用程序中,身份验证是必不可少的一项功能。身份验证的主要目的是确保用户是合法用户。因此,当用户访问某些受限页面或执行某些受限操作时,我们需要进行身份验证以保证用户的合法性。

    5 个月前
  • 了解 Mongoose 中的 Model.update()

    前言 Mongoose 是一个优秀的 MongoDB 对象模型工具,它可以让我们在 Node.js 中更加方便地操作 MongoDB 数据库。其中,Model.update() 是 Mongoose ...

    5 个月前
  • RxJS 中 debounce 和 throttle 的使用场景及比较

    引言 前端开发中经常遇到需要进行事件节流或者防抖的情况,比如,我们需要获取用户在输入框中输入的关键字,并根据此关键字进行搜索,但是用户实时的输入可能会对服务器造成过多的请求。

    5 个月前
  • SASS 与 Less、Stylus 的对比分析

    前端开发中,CSS 预处理器已经成为了必不可少的技术。它们通过给 CSS 添加了变量、函数、循环、嵌套等特性,使得 CSS 编写更加容易维护、灵活和高效。在 CSS 预处理器中,SASS、Less 和...

    5 个月前
  • Docker 部署 Kafka 应用实践教程

    Kafka 是一种流处理平台,它被广泛用于处理实时数据流,日志传输等方面。在现代化应用程序中,Kafka 非常流行,因为它可以用于处理大规模和复杂的数据流。Docker 是一种封装和分发应用程序的工具...

    5 个月前
  • ES10:Array.flat()、Array.flatMap() 及其他一个实用的新数组函数。

    随着 JavaScript 的发展,新的标准规范 ECMA-262 也随之推出,并带来了越来越多的新特性和新函数。在这篇文章中,我们将深入讨论 ES10 引入的新的数组函数,其中包括 Array.fl...

    5 个月前
  • Koa 应用中 HTTPS 和 HTTP 的切换

    Koa 是一个非常流行的 Node.js Web 框架,提供了非常简洁、灵活的 API,非常适合构建 Web 应用。在现代 Web 开发中,安全性非常重要,因此,使用 HTTPS 协议是一种保护用户数...

    5 个月前
  • 创建跨浏览器兼容的 CSS 动画:使用 LESS

    现如今,网页动画已成为许多网站的标配。动画能够增加网站的交互性、吸引用户的注意力以及提高用户的体验感。在前端开发中,CSS 动画是最常见的动画类型之一。然而,由于不同浏览器的支持性问题,要创建跨浏览器...

    5 个月前
  • Cypress E2E 测试:如何模拟用户使用场景

    在今天的前端开发中,Web 应用程序已经成为了必要的门户。保证这些应用程序的正确性和可靠性对任何组织都是至关重要的。在这样一个情况下,端到端 (E2E) 测试已经成为了 Web 应用程序测试中的常用工...

    5 个月前
  • 使用 RxJS 管理 Angular Form 表单状态的技巧

    前言 Angular 是一个强大的前端框架,它提供了许多功能帮助开发人员高效地构建复杂的单页应用程序。在其中,表单是一个关键的组件,在持久化和交互等方面具有重要的作用。

    5 个月前
  • Redis 中的 HASH 详解及使用场景

    Redis 是一种开源的高性能 key-value 存储系统,它支持多种数据类型,其中之一是 HASH。本文将详解 Redis 中 HASH 的使用方法、特点以及常见场景。

    5 个月前
  • 如何使用 Semantic UI 开发 SPA 应用

    Semantic UI 是一套基于语义化的 UI 框架,它提供了许多易于理解和使用的组件,能够快速地构建界面。 本文将介绍如何使用 Semantic UI 开发 SPA(Single-page app...

    5 个月前
  • Docker 部署 Elasticsearch 应用实践教程

    简介 Elasticsearch 是一种基于 Lucene 的搜索引擎。它提供了一个分布式、多租户能力的全文搜索和分析引擎,支持 RESTful Web 接口。Elasticsearch 在搜索、日志...

    5 个月前
  • ECMAScript 2020 中的 optional chaining 理解与实例

    在前端开发中,我们经常会遇到需要获取嵌套对象属性的情况。这种情况下,我们通常会使用判断语句来确保对象和属性的存在性,例如: -- ---- -- --------- -- --------------...

    5 个月前

相关推荐

    暂无文章