使用 Enzyme+jest 测试 React 组件防止测试漏洞

React 是一个非常受欢迎的前端框架,用于构建 Web 应用程序。在 React 开发过程中,单元测试是不可或缺的一部分。集成测试不仅有助于检测应用程序中的错误,而且可以防止测试漏洞的出现。Enzyme 和 Jest 是两个通常用于测试 React 组件的最流行框架,它们提供了一种简单的方式来测试您的应用程序。

在这篇文章中,我们将深入了解 Enzyme 和 Jest 并探讨如何使用它们来防止测试漏洞。

安装和配置 Enzyme 和 Jest

在使用 Enzyme 和 Jest 之前,您需要为项目安装两者。您可以通过 NPM 安装。

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

您需要创建一个配置文件用于 Jest。在项目根目录中创建一个名为 jest.config.js 的文件,并将以下内容复制到其中:

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

我们在配置文件的 testMatch 属性中指定了 Jest 匹配测试文件的路径。在这个例子中,我们使用 ** 来表示所有文件夹和文件。我们还在 setupFilesAfterEnv 属性中指定了一个文件夹,该文件夹中的代码将在每个测试运行之前运行。

接下来,创建一个名为 setupTests.js 的文件,并将以下代码添加到其中:

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

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

这里我们导入 Enzyme 和 React 适配器,然后将适配器配置给 Enzyme。

Enzyme 基础

在本节中,我们将深入了解 Enzyme 的基本概念,包括 Shallow Rendering 和 Mounting。

Shallow Rendering

Shallow Rendering 是 Enzyme 中的本地呈现方法,用于渲染 React 组件的一部分。Shallow Rendering 不执行嵌套组件中的代码,因此在测试组件时非常适用。

要使用 Shallow Rendering,您需要导入 Enzyme 并使用 shallow 方法渲染组件。例如:

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

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

在这个例子中,我们将 MyComponent 渲染到一个 ShallowWrapper 中,并使用 toMatchSnapshot() 比较结果,可以非常方便地测试输出。

Mounting

Mounting 是 Enzyme 中的完整渲染方法,用于渲染整个组件树,包括嵌套组件。由于 Mounting 可能会影响其他组件,因此在测试组件时需要小心。

要使用 Mounting,您需要导入 Enzyme 并使用 mount 方法渲染组件。例如:

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

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

在这个例子中,我们使用 mount() 方法渲染 MyComponent 并与快照进行比较。

封装组件

在 Enzyme 中,您可以使用的第三种方法是 Render Prop。Render Props 是 Enzyme 中的渲染模式之一,它允许您在组件内部呈现一个函数,从而可以在测试组件时方便地获取内部内容。

要使用 Render Prop,您需要将一个函数作为 prop 传递给组件。例如:

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

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

在渲染 MyComponent 时,我们使用传递给组件的函数作为参数,以获取在函数内部返回的内容。

基本 Jest

在本节中,我们将深入了解 Jest 的基本概念,包括匹配器和模拟。

Matchers

Jest 提供了许多内置匹配器,您可以使用它们来测试不同的数据类型。这里有一些常用的匹配器:

  • toBe(expected):比较值是否与期望值相同;
  • toEqual(expected):递归地比较对象是否相等;
  • toMatch(regexp):比较字符串是否与正则表达式匹配;
  • toContain(expected):比较数组或迭代器中是否包含一个值;
  • toThrow(error):比较函数是否会抛出一个错误。

以下是一个使用 toBe() 匹配器测试字符串的例子:

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

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

模拟

在测试过程中,您可能需要模拟某些组件或函数,从而使测试更为真实。

对于函数,使用 jest.fn() 可以为其创建一个模拟函数。例如:

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

这里我们在组件渲染之前创建了一个模拟函数 handleButtonClick,并将其作为 prop 传递给组件。我们然后模拟按钮单击事件,并使用 toHaveBeenCalled() 匹配器检查模拟函数是否已调用。

对于组件,使用 jest.mock() 可以为其创建一个模拟组件。例如:

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

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

这里我们使用 jest.mock() 来为 MyComponent 创建一个模拟组件。我们对 App 组件进行浅渲染,并使用 toHaveLength() 匹配器检查是否已呈现一个 MockMyComponent。

结论

在本文中,我们介绍了 Enzyme 和 Jest 的基础知识,并演示了如何使用它们来防止测试漏洞。

通过使用 Enzyme 和 Jest 的基本知识,您应该能够编写高质量的 React 组件测试并防止测试漏洞的出现。希望这篇文章有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6735eb7c0bc820c5825136c2