如何使用 Enzyme 和 Jest 进行 React 组件的测试

阅读时长 15 分钟读完

React 是一个流行的前端框架,它提供了一种基于组件的方式来构建用户界面。而为了保证组件的质量和稳定性,测试是必不可少的步骤。Enzyme 和 Jest 是两个常用的前端测试工具,本文将介绍如何使用 Enzyme 和 Jest 进行 React 组件的测试。

Enzyme 和 Jest 简介

Enzyme 是由 Airbnb 开发的 React 组件测试工具,它提供了一组简单易用的 API,可以方便地模拟组件的渲染、交互和断言。Enzyme 支持多种渲染方式,包括浅渲染(shallow rendering)、完整渲染(mounting)和静态渲染(static rendering),可以根据需要选择不同的方式进行测试。

Jest 是 Facebook 开发的 JavaScript 测试框架,它提供了一组全面的测试工具和 API,可以用于测试各种类型的 JavaScript 代码,包括 React 组件。Jest 支持快照测试(snapshot testing)、单元测试(unit testing)和集成测试(integration testing),可以根据需要进行测试。

安装 Enzyme 和 Jest

在使用 Enzyme 和 Jest 进行测试之前,需要先安装它们。可以使用 npm 或 yarn 进行安装。在项目根目录下执行以下命令:

或者使用 yarn:

其中,enzyme-adapter-react-16 是适配 React 16 的 Enzyme 适配器,需要根据实际情况选择不同的适配器。

使用 Enzyme 进行测试

Enzyme 提供了三种渲染方式,可以根据需要选择不同的方式进行测试。

浅渲染(shallow rendering)

浅渲染是一种快速而简单的测试方式,它只渲染组件的一层子组件,不会渲染子组件的子组件。浅渲染可以用于测试组件的结构和属性,但不能测试组件的交互和状态。

以下是一个简单的组件:

使用浅渲染方式测试该组件:

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

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

在测试中,使用 shallow 函数创建一个浅渲染的组件实例,然后使用 find 和 prop 函数查找和断言组件的属性。

完整渲染(mounting)

完整渲染是一种更真实的测试方式,它会渲染组件的所有子组件,包括子组件的子组件。完整渲染可以用于测试组件的交互和状态,但需要注意测试的性能和可维护性。

以下是一个带有状态的组件:

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

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

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

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

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

使用完整渲染方式测试该组件:

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

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

在测试中,使用 mount 函数创建一个完整渲染的组件实例,然后使用 simulate 函数模拟组件的交互和状态,最后使用 find 和 text 函数查找和断言组件的状态和属性。

静态渲染(static rendering)

静态渲染是一种不渲染组件的测试方式,它只是将组件作为一个纯函数进行测试。静态渲染可以用于测试组件的输出和逻辑,但不能测试组件的交互和状态。

以下是一个带有逻辑的组件:

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

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

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

使用静态渲染方式测试该组件:

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

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

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

在测试中,使用 render 函数创建一个静态渲染的组件实例,然后使用 text 函数查找和断言组件的输出。

使用 Jest 进行测试

Jest 提供了多种测试方式,可以根据需要选择不同的方式进行测试。

快照测试(snapshot testing)

快照测试是一种比较简单而有用的测试方式,它会将组件的输出保存为一个快照文件,然后在后续的测试中对比快照文件和实际输出,以确保组件的输出不会发生意外的变化。快照测试可以用于测试组件的结构和样式,但不能测试组件的交互和状态。

以下是一个带有样式的组件:

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

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

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

使用快照测试方式测试该组件:

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

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

在测试中,使用 create 函数创建一个组件实例,然后使用 toJSON 函数将组件输出转换为一个 JSON 对象,最后使用 toMatchSnapshot 函数对比快照文件和实际输出。

单元测试(unit testing)

单元测试是一种测试组件的函数和逻辑的方式,它可以用于测试组件的输入和输出,以及组件的内部逻辑和处理。单元测试需要对组件进行模拟和隔离,以确保测试的准确性和可靠性。

以下是一个带有函数和逻辑的组件:

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

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

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

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

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

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

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

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

使用单元测试方式测试该组件:

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

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

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

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

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

在测试中,使用 jest.fn 函数创建一个模拟函数,然后使用 shallow 函数创建一个浅渲染的组件实例,最后使用 simulate 函数模拟组件的交互和状态,并使用 toHaveBeenCalledWith 函数断言模拟函数的参数和调用。

集成测试(integration testing)

集成测试是一种测试组件的交互和状态的方式,它可以用于测试组件的输入和输出,以及组件之间的交互和状态。集成测试需要对组件进行完整渲染,以确保测试的真实性和可靠性。

以下是一个带有状态和交互的组件:

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

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

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

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

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

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

使用集成测试方式测试该组件:

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

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

在测试中,使用 mount 函数创建一个完整渲染的组件实例,然后使用 simulate 函数模拟组件的交互和状态,并使用 find 和 text 函数查找和断言组件的状态和属性。

结论

Enzyme 和 Jest 是两个常用的前端测试工具,它们提供了一组简单易用的 API 和全面的测试工具和 API,可以用于测试各种类型的 JavaScript 代码,包括 React 组件。在使用 Enzyme 和 Jest 进行测试时,需要根据实际情况选择不同的测试方式和适配器,以确保测试的准确性和可靠性。

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

纠错
反馈