如何在 Jest 和 Enzyme 中使用 Snapshot Testing 实现可视化测试

随着前端应用程序变得越来越复杂,我们需要更高效的测试方法来确保代码的稳定性和可靠性。其中一种测试方式就是可视化测试,它可以对组件的渲染、布局和交互进行测试。在这篇文章中,我们将介绍如何在 Jest 和 Enzyme 中使用 Snapshot Testing 来实现可视化测试。

什么是 Snapshot Testing

Snapshot Testing 是一种测试方法,可以对组件的渲染结果进行快照比较,如果快照与之前保存的快照不同,则测试失败。快照测试的好处是非常容易编写和维护。它不需要手动编写断言,也不需要关心实际输出的值,只需要比较快照即可。

为什么使用 Jest 和 Enzyme

Jest 是一个由 Facebook 开发的开源测试框架,它用于编写和运行测试。Jest 提供了一个易于使用的 API 来编写测试用例,并且内置了断言库和 Mock 库等工具。

Enzyme 是一个由 Airbnb 开发的 JavaScript 测试工具,它提供了一个 API 来模拟 React 组件的渲染、布局和交互。Enzyme 支持多种渲染方法,并且可以与 Jest 无缝集成。

使用 Jest 和 Enzyme 的好处是它们能够提供一个完整的测试生态系统,可以覆盖 React 组件的各个方面,包括渲染、布局、交互和状态管理等。

安装和配置 Jest 和 Enzyme

首先,我们需要安装 Jest 和 Enzyme:

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

然后,我们需要在 package.json 文件中配置 Jest:

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

上面的配置文件告诉 Jest 使用 Node.js 环境运行测试,并在每个测试文件运行之前运行 setupTests.js 文件。

最后,我们需要在 src/setupTests.js 文件中配置 Enzyme:

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

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

上面的代码告诉 Enzyme 使用 React 16 作为适配器。如果你使用的是不同版本的 React,需要相应地更改适配器。

如何使用 Snapshot Testing

现在,我们已经完成了 Jest 和 Enzyme 的安装和配置,接下来我们将展示如何使用 Snapshot Testing。

渲染组件

首先,我们需要渲染一个 React 组件,并将其保存为快照。例如,以下代码使用 Enzyme 渲染了一个简单的 React 组件:

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

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

渲染组件并将其保存为快照只需要一行代码:expect(wrapper).toMatchSnapshot();

Jest 会将快照保存到 __snapshots__ 目录下,然后在下一次运行测试时与新的快照进行比较。

更新和比较快照

当我们第一次运行测试时,Jest 会生成一个新的快照并将其保存到 __snapshots__ 目录下。下一次运行测试时,Jest 会将新的快照与旧的快照进行比较。

如果新的快照与旧的快照相同,则测试通过。如果不同,则测试失败,并且需要手动检查差异并决定是否更新快照。以下代码演示了如何更新快照:

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

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

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

上面的代码演示了如何使用 setProps() 方法更改组件的属性,并更新快照。当你第二次运行测试时,Jest 会将新的快照与旧的快照进行比较,如果二者不同,则测试失败。

忽略部分子组件

有时,我们可能希望忽略某些子组件的快照。例如,当子组件是一个带有随机数或时间戳的计数器时,其渲染结果会发生变化,这会导致快照不稳定。

在这种情况下,我们可以使用 enzyme-to-json 库来忽略子组件的快照。以下是如何使用它的示例代码:

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

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

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

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

上面的示例代码演示了如何使用 createSerializer() 方法创建一个快照序列化程序,并创建一个快照,其中 clock 是一个带有 Date 类型的随机数。这个示例中就会忽略 clock 的快照。

忽略样式和动画

有时,我们可能希望忽略组件的样式和动画效果,以便使快照更加稳定。在这种情况下,我们可以使用 jest-styled-components 来忽略组件的样式,使用 jest-transform-css 来忽略动画效果。

先安装这些库:

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

然后,在 Jest 的配置文件中增加以下配置:

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

上面的配置文件告诉 Jest 使用 jest-transform-css 来处理 CSS 文件,并使用 jest-styled-components 来忽略组件的样式。然后在 Enzyme 中使用 mount() 方法渲染组件,并且在测试用例中使用 toMatchSnapshot() 方法保存快照。

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

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

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

使用 jest-styled-components 可以忽略组件的样式,使得快照更加稳定。

总结

在本文中,我们介绍了如何在 Jest 和 Enzyme 中使用 Snapshot Testing 实现可视化测试。我们先介绍了 Snapshot Testing 的概念和其优点,然后演示了如何安装和配置 Jest 和 Enzyme。最后,我们详细说明了如何使用快照测试,并介绍了如何忽略子组件、样式和动画。

Snapshot Testing 是一个非常好的测试方法,可以帮助我们更快地编写和维护测试用例。当你开始使用 Snapshot Testing 时,请记得确保测试覆盖率足够高,并尽可能地涵盖各种可能的测试场景。

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


猜你喜欢

  • 利用 PM2 实现 Node.js 进程自动化部署

    在 Node.js 开发中,随着项目的不断发展,对于进程的管理和监管变得越来越重要。尤其是在部署上,手动启动和停止 Node.js 进程会很麻烦,一个不小心就会出现诸如进程挂掉、内存爆掉等问题。

    1 年前
  • Angular Service 的依赖注入

    Angular 是一款前端框架,通过使用服务提供商来提供模块和组件的依赖项。Angular 通过依赖注入机制使得组件在启动时可以获取到所需的服务,而不需要手动实例化或者维护它们之间的关系。

    1 年前
  • 实现基于 Node.js 的 Web 爬虫

    Web 爬虫是一种自动化程序,能够按照指定的规则,自动地从网络上抓取数据。在前端领域,爬虫也是非常重要的技术之一。在本文中,我们将介绍如何使用 Node.js 实现基于 Web 的爬虫技术。

    1 年前
  • LESS 中输出不同的样式版本以适配不同的浏览器

    随着互联网的发展,越来越多的人开始使用不同的浏览器来访问网站。但是,不同的浏览器对CSS的支持程度不尽相同,这就使得前端开发人员在编写CSS时需要考虑到不同的浏览器兼容性的问题。

    1 年前
  • Mongoose 中的 Schema 类型与验证详解

    Mongoose 是 Node.js 中操作 MongoDB 数据库的主要库之一,它提供了方便的数据模型定义和操作。其中,Schema 类型和验证功能是 Mongoose 的核心特性之一。

    1 年前
  • React 中的 Fragment 的作用及使用示例

    在 React 组件中,都是返回单一的节点。但是有时候,我们需要在组件中返回多个节点,但是又不想增加额外的结构,这时候就需要用到 React 中的 Fragment。

    1 年前
  • WebSocket 和 Socket.io:实时推送技术的不同实现方式

    背景 在现代 WEB 应用程序中,实时推送技术已经成为必不可少的一部分,这样可以让客户端及时地接收到有关应用程序的事件和数据,并且不需要定期向服务器发送请求来获取更新。

    1 年前
  • RESTful API 如何跨域访问?

    RESTful API 如何跨域访问? 近年来,随着前端技术的迅速发展,利用 JavaScript 操作 API 的方式愈来愈流行,而 RESTful API 相对于传统的 API 更为灵活,因此也越...

    1 年前
  • 使用 Tailwind CSS 构建搜索框

    什么是 Tailwind CSS? Tailwind CSS 是一种实用性的 CSS 框架,它的目标是让开发者仅使用 CSS 类就可以轻松构建用户界面。Tailwind CSS 拥有一个庞大的 CSS...

    1 年前
  • 分布式系统性能优化技巧

    随着互联网的普及,业务不断拓展,分布式系统的需求也越来越大。然而,在搭建分布式系统时,我们经常会遇到性能问题,比如慢响应、请求超时等。因此,本文将讨论分布式系统的性能优化技巧,以帮助开发者更好地搭建系...

    1 年前
  • MongoDB 教程:如何使用索引

    MongoDB 是一种 NoSQL 数据库,采用文档型存储方式,被广泛应用在大量 Web 和移动应用程序中。MongoDB 具有高性能,可伸缩性强等优点,但是随着数据量的增长,查询效率需要得到更好的保...

    1 年前
  • ECMAScript 2017 (ES8) 中的 Object.values() 与 Object.entries() 详解

    ECMAScript 2017 (ES8) 中的 Object.values() 与 Object.entries() 详解 在前端开发中,JavaScript 一直是最重要的编程语言之一,而 ECM...

    1 年前
  • Redis 在高并发场景下的应用优化

    前言 Redis是一种高性能、非关系型、内存中的数据结构存储系统。由于快速的数据读写速度和高可用性,Redis已经成为许多高并发的应用程序中不可或缺的一部分。虽然Redis本身就很高效,但是在高并发场...

    1 年前
  • Mocha 测试中如何测试控制台输出

    在前端开发中,测试是至关重要的一部分。Mocha 是一个流行的 JavaScript 测试框架,它支持 BDD(行为驱动开发),TDD(测试驱动开发)等多种测试方式。

    1 年前
  • Kubernetes 使用 Kubeadm 快速部署集群教程

    Kubernetes 是一个开源的容器编排平台,它可以帮助开发人员在集群中管理、调度和部署容器化的应用程序。如果你正在学习 Kubernetes 或者需要在生产环境中使用它,这篇文章将为你介绍如何快速...

    1 年前
  • 通过 Flexbox 解决 CSS Reset 的布局问题

    在前端开发中,经常会使用 CSS Reset 来消除不同浏览器之间的样式差异。但是,在使用 CSS Reset 后,会遇到布局问题,需要重新编写很多样式规则。在这种情况下,我们可以使用 Flexbox...

    1 年前
  • Promise 中使用 try catch 的最佳实践

    什么是 Promise Promise 是一种处理异步操作的方式,它是 ES6 引入的特性。Promise 主要用于处理异步操作,其可以接收一个异步操作并在异步操作执行成功后返回结果;如果异步操作执行...

    1 年前
  • Next.js 中 LESS 文件配置

    在前端开发中,CSS 是不可或缺的一部分。在 CSS 预处理器中,LESS 是一个相当流行的选项,它比原生的 CSS 提供了更多的功能和便利。在 Next.js 中,配置 LESS 文件也很轻松。

    1 年前
  • ECMAScript 2020 (ES11) 中的平开操作符(flat)的使用指南

    在 ECMAScript 2020 (简称 ES11)中,新增了一个重要的数组操作符平开操作符(flat)。这个操作符可以将嵌套的数组降维为一维数组,以便更方便地处理数组元素。

    1 年前
  • 想要提高 Deno 的性能?请注意这些要点

    Deno 是一个新兴的 JavaScript 和 TypeScript 运行时环境,具有高度的安全性和可靠性,而且还支持本地文件访问、网络请求等功能。然而,与其它流行的 JavaScript 运行时环...

    1 年前

相关推荐

    暂无文章