Enzyme 和 Jest 搭配测试 React 项目的指南

阅读时长 8 min read

React 是一个非常流行的前端框架,为了确保代码的质量和稳定性,我们需要进行测试。其中 Enzyme 和 Jest 是两个常用的工具,用于测试 React 项目。本文将详细介绍 Enzyme 和 Jest 的使用方法,并提供示例代码。

Enzyme

Enzyme 是 AirBnB 公司推出的一款 React 组件测试工具。它提供了一个简洁的 API,可以轻松地测试 React 组件的渲染结果、交互行为和状态变化。下面是 Enzyme 的安装方法:

这里使用 enzyme-adapter-react-16 适配器,适配 React 16 的版本。如果你使用的是其他版本的 React,可参考 Enzyme 的文档自行选择适配器。

测试 DOM 渲染

对于一个简单的 React 组件,我们可以通过以下代码完成对其 DOM 渲染的测试:

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

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

上面代码中,我们首先导入了 React 和 Enzyme 的 shallow 方法,以及待测试的组件 App。之后使用 shallow 方法渲染组件,并使用 expect 断言语句,将渲染结果与期望结果进行比较。在这里,我们使用了一个快照(Snapshot)测试,这种测试会记录组件在某个时刻的输出,用于与未来的输出进行比较。

测试交互行为

除了测试 DOM 渲染,我们还可以测试组件的交互行为。对于一个包含点击事件的按钮组件,我们可以通过以下代码测试点击事件是否正确触发:

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

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

在这里,我们首先创建了一个模拟函数 onClickMock,用于模拟点击事件处理函数。然后,我们使用 shallow 渲染了待测试的组件 Button,并在按钮元素上触发点击事件。最后,我们使用 expect 断言语句判断 onClickMock 是否被正确地调用。

测试状态变化

除了测试组件的渲染结果和交互行为,我们还可以测试组件的状态变化。一个典型的测试过程可以如下所示:

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

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

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

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

在这里,我们首先使用 shallow 渲染了待测试的组件 Counter,并找到按钮元素。接着,我们模拟了两次点击事件,并分别断言按钮元素的文本内容是否符合预期。

Jest

Jest 是 Facebook 推出的一款 JavaScript 测试框架,专门用于测试 React 应用。它提供了一套完整的测试工具链,包括断言库、Mock 模块、快照测试等,使用起来非常方便。下面是 Jest 的安装方法:

这里我们同时安装了 babel-jest 和 @babel/preset-env / @babel/preset-react,以便 Jest 能够正确识别和编译 ES6 和 JSX 代码。

单元测试

对于一个简单的函数,我们可以通过以下代码进行单元测试:

在这里,我们首先定义了一个简单的加法函数 sum,然后在 test 内部调用 expect 断言语句,判断函数输出是否符合预期。如果测试通过,说明函数执行结果正确。

快照测试

快照测试是 Jest 的一大特色,它可以记录组件在某个时刻的输出结果,并自动将其保存在文件中。之后,每次测试运行的时候,都会将实际输出与预期输出进行比较,用于检查组件是否正常工作。下面是一个简单的示例:

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

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

在这里,我们使用了 Jest 内置的 renderer 方法,以生成组件的快照。这里需要注意,快照测试尽量不要在样式相关的组件上进行,因为样式可能受到浏览器、环境等因素的影响,导致输出结果不一致。

测试工具链搭配

最后,我们需要将 Enzyme 和 Jest 进行搭配,以便充分利用两个工具的优势。具体来说,我们可以通过以下命令将它们进行配置:

然后,在 Jest 的配置文件(一般为 jest.config.js 或者 package.json 文件)中,加入以下配置项:

这样就完成了 Enzyme 和 Jest 的互相支持。现在,我们可以通过以下代码,完成对组件的全面测试:

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

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

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

在这里,我们使用了 Enzyme 的 shallow 方法进行组件渲染,使用 Jest 自带的 expect 断言语句进行断言,用 renderer 完成了快照测试。通过这种方式,我们可以快速而准确地完成对 React 组件的测试。

结语

本文详细介绍了 Enzyme 和 Jest 的使用方法,并提供了详细的示例代码。在实际开发过程中,合理地搭配使用这两个工具,能够有效地提高代码的可靠性和稳定性,降低开发成本。同时,我们也需要关注测试的边界与覆盖率,以确保测试套件能够尽可能地覆盖所有可能的情况。

Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d039e9e46428fe9ecfbef5

Feed
back