Enzyme 测试 React 组件:手把手教你入门

阅读时长 9 分钟读完

Enzyme 测试 React 组件:手把手教你入门

前言

随着 React 技术的越来越普及,React 组件的可测试性变得越来越重要。而 Enzyme 就是一款很好用的测试 React 组件的库。Enzyme 提供了很多渲染组件的函数,使得我们可以很方便地测试组件的行为和输出。

介绍

Enzyme 是 Airbnb 开源的 React 组件测试工具库,它可以帮助我们测试 React 组件的 render 和交互,而无需真正渲染到浏览器或客户端。Enzyme 提供了 3 种渲染器:shallow、mount 和 render 。其中,shallow 渲染器只会渲染当前组件,不渲染其子组件;mount 渲染器会渲染整个组件树,并执行完整的生命周期;render 渲染器和 mount 一样,会渲染整个组件树,但是不会执行完整的生命周期,返回一个静态的 HTML 结构。

安装

在使用 Enzyme 测试之前,我们需要安装 Enzyme 和相关的适配器,以配合我们的 React 版本使用。

首先,我们需要安装 Enzyme :

然后,我们需要安装适配器,以适应我们目前使用的 React 版本:

接着,在项目的根目录下建立一个 setupTests.js 文件,并在其中配置 Enzyme :

这样,我们就完成了 Enzyme 的安装和配置。

测试 shallow 渲染器

首先,我们来测试最常用的 shallow 渲染器。下面,我们将用一个简单的计数器组件来演示。

首先,我们用 create-react-app 新建一个测试项目,安装所需的库和组件。接着,在 src 目录下新建一个 Counter 组件:

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

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

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

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

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

这个 Counter 组件包含了一个计数器,以及一个按钮,每次点击可以将计数器加 1。接着,我们在 src 目录下新建一个 Counter.test.js 文件:

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

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

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

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

解释一下代码:

第一行导入 React 和 shallow 渲染器; 第二行导入 Counter 组件; 我们通过 describe 函数来分组测试用例; 第一个测试用例测试组件的快照内容是否正确; 第二个测试用例测试组件是否能够正确地渲染计数器的初始值; 第三个测试用例测试当用户点击按钮时,是否能够使计数器的值加 1。

上述测试用例中用到的三个函数:

shallow: Enzyme 的浅层渲染函数。它可以让我们快速渲染一个组件,但不会渲染其子组件。 find: Enzyme 的选择器函数。我们可以通过它来选择一个或多个特定的节点。 simulate: Enzyme 的交互函数。我们可以使用它来模拟用户与组件进行交互的行为。

测试 mount 渲染器

接着,我们来测试 mount 渲染器。与 shallow 渲染器不同,mount 渲染器会将整个组件树渲染出来,并执行完整的生命周期,使得我们可以测试包括子组件在内的所有组件。与 shallow 渲染器一样,我们可以通过 import { mount } from 'enzyme' 来引入 mount 渲染器。

我们来修改一下 Counter 组件,将它的增量改为 2,这样可以更好地演示 mount 渲染器的功能:

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

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

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

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

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

接着,我们修改 Counter.test.js 文件,引入 mount 渲染器,来测试整个组件树:

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

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

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

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

可以看到,修改代码非常简单,只需将 shallow 改为 mount 就可以了。测试用例跟以前一样,没有变化。

测试 render 渲染器

最后,我们来测试 render 渲染器,它与 mount 渲染器不同,它不会执行完整的生命周期,也不会将组件渲染到 DOM 中,而是返回一个静态的 HTML 结构,所以主要用于测试组件是否能够正确地渲染 HTML。

我们来新建一个 Animal 组件,用于演示如何使用 render 渲染器:

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

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

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

接着,我们在 Animal.test.js 文件中测试 render 渲染器:

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

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

我们在第一行导入 React,然后引入 render 渲染器,然后在测试用例中使用 render 渲染器来渲染 Animal 组件。最后,我们断言渲染的结果是否正确。

总结

通过本文的介绍,相信读者已经对测试 React 组件有了一定的了解。测试是开发中必不可少的环节,良好的测试案例可以大大提升产品的质量,并提高代码的可维护性。有了 Enzyme 这样的测试工具库,我们可以很方便地测试 React 组件,并且可以通过不同的渲染器达到不同的测试目标。希望读者可以通过本文的介绍,进一步提高自己的前端开发技能。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6465eab8968c7c53b0694230

纠错
反馈