解决 Enzyme 测试 React 组件中渲染大量元素的问题

阅读时长 5 分钟读完

如果你在开发 React 组件的过程中,使用了 Enzyme 来进行测试,那么你可能会遇到一个问题:当你测试一个渲染了大量元素的组件的时候,Enzyme 的渲染速度会变得非常慢,甚至会导致测试超时或者卡死。

这篇文章将会介绍一些可以解决这个问题的方法。

问题的根源

首先,我们需要了解问题的根源是什么。

当使用 Enzyme 进行测试的时候,Enzyme 实际上是通过模拟 DOM 来进行渲染和测试的。因此,当你测试一个渲染了大量元素的组件的时候,Enzyme 需要模拟的 DOM 元素也会变得非常多,这会导致测试速度变慢。

而且,在测试中,React 实际上还会触发一些不必要的渲染。例如,在使用 wrapper.find() 时,React 实际上会重新渲染组件来查找相应的元素。这也会导致测试速度变慢。

解决方法

使用 .shallow() 而不是 .mount()

Enzyme 提供了两种渲染方法:.shallow().mount().mount() 会完整地渲染组件及其子组件,而 .shallow() 只会渲染组件本身。

因此,当你测试一个渲染了大量元素的组件时,最好使用 .shallow() 而不是 .mount(),这样可以减少 Enzyme 需要模拟的 DOM 元素数量。

例如,考虑下面这个简单的组件:

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

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

这个组件渲染了 1000 个 <span> 元素。如果使用 .mount() 来进行测试,那么测试速度会非常慢。但是如果使用 .shallow() 来进行测试,测试速度就会快很多。

使用 .findWhere() 而不是 .find()

如前所述,React 在使用 .find() 时会重新渲染整个组件树,这会导致测试速度变慢。但是,Enzyme 还有一个 .findWhere() 方法,可以更加高效地查找元素。

.findWhere() 可以接受一个回调函数,来查找符合条件的元素。这样就可以避免 React 重新渲染整个组件树。

例如,在上面的例子中,使用 .find() 来查找第一个 <span> 元素的代码是这样的:

但是,使用 .findWhere() 可以更加高效地查找元素:

使用 jest.useFakeTimers()jest.runOnlyPendingTimers()

有些组件样式或功能可能需要在特定的时间间隔内运行。在这种情况下,Enzyme 的测试速度会变得非常慢,因为 Enzyme 的默认设置是等待所有计时器完成后才继续运行测试。

解决这个问题的方法非常简单——使用 Jest 提供的 jest.useFakeTimers()jest.runOnlyPendingTimers() 方法,来在测试中控制计时器的行为。

例如,在下面这个假设我们使用了 setTimeout() 来延迟一些功能的组件中,我们可以使用 jest.useFakeTimers() 来在测试中控制计时器:

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

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

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

在测试中,我们可以这样写:

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

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

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

结论

在使用 Enzyme 进行测试时,如果你遇到了渲染大量元素的组件导致测试速度变慢的问题,可以使用上述方法进行优化。在实际的项目中,这些方法可能无法完全解决问题,但是它们可以显著提高测试速度,让你的测试不会消耗太多时间。

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

纠错
反馈