Enzyme 测试教程:使用 mount() 与 shallow() 差异化测试 React 组件

React 组件的测试是前端开发的重要一步,而 Enzyme 就是 React 的一个测试工具。Enzyme 允许开发者对 React 组件进行深度的测试,同时也可以对组件的渲染结果进行全面的检查。在进行 React 组件测试时,开发者通常会使用 mount() 和 shallow() 两种测试方法。这篇文章将向你介绍如何使用 mount() 和 shallow() 这两种方法,以及它们的差异化测试策略。

Mount() 方法

Mount() 方法可以将 React 组件渲染至真实的 DOM 树中,这么做会涉及到组件和它的子组件的生命周期函数,包括 componentDidMount() 和 componentWillUnmount() 等。因此,mount() 方法是用来测试真实环境下组件的渲染和交互情况的。

在 Enzyme 中,使用 mount() 方法渲染组件如下所示:

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

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

上述代码中,我们使用 import 导入 Enzyme 的 mount() 方法,然后在测试用例里,使用 mount() 方法渲染了一个名为 MyComponent 的组件。之后,我们可以使用 expect() 断言 wrapper.text() 中的横幅信息是否正确。

在使用 mount() 方法时,注意要指出你要测试的组件,同时去除有状态的父组件,以保证只测试你所需要的组件。

Shallow() 方法

和 mount() 的测试思路不同,shallow() 方法只会测试当前组件,而不会涉及到测试组件子代的生命周期和一次性行为。这种“视图”测试方式,使得 shallow() 方法更适合进行组件 API 和属性测试,同时也能更好地测试纯函数性组件。

在 Enzyme 中,使用 shallow() 方法渲染组件如下所示:

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

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

上述代码中,我们使用 import 导入 Enzyme 的 shallow() 方法,然后在测试用例里,使用 shallow() 方法渲染了一个名为 MyComponent 的组件。之后,我们可以使用 expect() 断言 wrapper.find() 中的 h1 元素是否存在,并且其文本内容是否为“Hello, World!”。

和使用 mount() 方法进行测试的情况类似,使用 shallow() 方法时,也要注意去除有状态的父组件,以保证只测试你所需要的组件。

测试案例举例

假设我们的项目有一个 Image 组件,它的 props 包含 src, alt 和 fallback。图片加载过程中可能出现错误,这时候就需要显示一个备用图片。

考虑到在不同的加载状态下 Image 组件的渲染,我们可以分别使用 mount() 和 shallow() 方法进行测试。

mount() 方法测试:

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

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

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

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

上述代码中,我们测试了 Image 组件的三种可能情况:第一种是正确加载渲染图片的情况,第二种是加载失败的情况,第三种是检查 alt 属性的情况。我们使用了 mount() 方法测试整个组件,并使用断言来验证我们测试的结果是否正确。

shallow() 方法测试:

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

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

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

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

上述代码中,我们测试了 Image 组件的三种可能情况:第一种是正确加载渲染图片的情况,第二种是加载失败的情况,第三种是检查 alt 属性的情况。与使用 mount() 方法测试不同的是,我们使用 shallow() 方法进行测试。同样地,我们使用断言来验证我们测试的结果是否正确。

当我们分别测试了这三种情况时,mount() 方法和 shallow() 方法都能达到预期的效果。shallow() 方法比 mount() 方法更加快速和轻量,同时又可以保证测试的准确性。但是,有时候如果我们需要展示一些组件的子组件的逻辑,或者有些组件在组装的时候产生了一些副作用,我们就需要选择 mount() 方法进行测试。

结论

在这篇文章中,我们介绍了 Enzyme 的两种测试方法:mount() 和 shallow(),并分别针对 Image 组件进行了测试。这种测试方法的选择取决于你所需要的测试类型和测试目的。当你测试一个组件时,要根据实际情况选择相应的测试方法,以确保测试的准确性和成功率。希望这篇文章能帮助你更好地使用 Enzyme 进行 React 组件测试。

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