如何使用 Enzyme 测试 React Portal?

React Portal 是一种非常有用的特性。它可以让我们在 React 应用中渲染层级高于元素树的组件。这使得我们可以轻松创建一些很难在普通的元素树中实现的功能,比如模态框、多级下拉菜单等。但是,在测试这些组件时,就需要一些额外的工作。本文将介绍如何使用 Enzyme 测试 React Portal。

什么是 Enzyme?

Enzyme 是 Airbnb 出品的一个 React 组件测试工具库,它提供了一些方便的 API,可以让我们轻松地模拟组件的渲染,并方便地操作组件的 props 和 state,以及模拟用户的操作。Enzyme 有三种模式:Shallow、Mount、Render,不同的模式适合不同的测试场景。详情可以参考 Enzyme 官方文档。

测试 React Portal

在测试 React Portal 之前,我们需要先了解 Portal 的具体实现方式。React 中 Portal 的原理就是将组件渲染到指定的目标容器中。在 React 中,我们可以使用 ReactDOM.createPortal 方法来创建一个 Portal 。其中,第一个参数是要渲染的元素,第二个参数是要渲染到的容器。

下面是一个简单的例子:

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

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

在这个例子中,我们创建了一个名为 Modal 的组件,它通过 ModalPortal 渲染到了 modal-root 容器中。

接下来,我们看一下如何测试这个 Modal 组件。

首先,我们需要创建一个测试用例,并使用 mount 方法渲染 Modal 组件。在渲染完成后,我们就可以通过选择器或者其他方法找到 Modal 中的元素并进行断言。

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

这段代码非常简单,我们使用 mount 方法渲染 Modal 组件,并判断 .modal-background.modal-content 元素是否存在。

但是,如果我们希望测试一些需要在 modal-root 容器中进行的操作,比如弹框等。我们需要将 ModalPortal 的容器挪到 document.body 的直接子节点,否则你的测试用例将失败。

在测试之前,我们需要先将 ModalPortal 的容器挪到 document.body 的直接子节点。

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

这里我们使用了 useState 以及一个自执行函数来创建一个 modalPortal 元素,并将它加到 document.body 的直接子节点。

接下来,我们就可以开始测试了。

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

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

在这个测试中,我们首先检查渲染之后,.modal-background.modal-content 元素是否存在,它们都应该不存在,因为 Modal 组件的 open 属性是 false。然后,我们通过调用 setProps 方法,将 open 属性设置为 true。接着,我们再次检查 .modal-background.modal-content 元素是否存在,这次应该都存在了。

至此,我们就成功地测试了一个 React Portal。

结论

测试 React Portal 需要注意一些特殊情况,因为这种组件渲染到了普通组件树之外。但是,使用 Enzyme 却可以让我们轻松地测试这种组件。本文提供了一些实用的技巧,希望可以对你的测试工作有所帮助。

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