Enzyme + React Native:如何测试异步更新的视图

阅读时长 9 分钟读完

Enzyme + React Native:如何测试异步更新的视图

在 React Native 开发中,异步更新的视图是一种常见且必不可少的情况。然而,这也会带来一些测试的挑战。本文将介绍如何使用 Enzyme 来测试 React Native 应用程序中的异步更新视图。我们将建立一个简单的“计时器”应用程序,并展示如何使用 Enzyme 和 React Native 测试库来测试其 AsyncStorage 状态的更改。

引入 Enzyme

首先,我们需要在项目中引入 Enzyme。Enzyme 是一个供 React 应用程序使用的 JavaScript 测试实用程序。它为 React 组件提供了一组强大的工具,帮助您更轻松地进行单元测试。

在 React 应用程序中使用 Enzyme 的第一步是安装它。使用以下命令安装 Enzyme:

接下来,您需要配置 Enzyme 以在项目中使用 React 16+。在项目根目录中创建一个名为“setupTests.js”的文件,并将以下内容添加到文件中:

现在,我们已经准备好开始编写测试了。

创建计时器应用程序

我们将开始创建一个简单的计时器应用程序,该应用程序使用 AsyncStorage 来存储计时器的当前时间。当计时器开始时,它将在每秒钟更新一次存储在 AsyncStorage 中的时间。我们将展示如何使用 Enzyme 测试存储在 AsyncStorage 中的时间更新是否按预期进行。

首先,我们需要创建一个名为“Timer.js”的 React Native 组件。该组件将渲染一个文本标签,显示存储在 AsyncStorage 中的时间。代码如下:

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

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

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

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

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

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

在此代码中,我们导入 React、useState、useEffect、Text、View 和 AsyncStorage 组件。我们定义了一个名为“Timer”的函数式组件,它接受一个 state 变量“time”,该变量初始值为当前日期(创建组件时初始值)。在 useEffect 钩子函数中,我们创建了一个名为“interval”的 setInterval 集合,该集合每秒更新一次“time”变量,并将其存储在 AsyncStorage 中。该组件最终呈现了一个文本标签,它显示存储在 AsyncStorage 中的时间。

现在,我们已经创建了一个定时器组件,让我们使用 Enzyme 和 React Native 测试库来检查它的行为是否按预期进行。

测试

我们将使用 Enzyme 和 React Native 测试库创建两个测试:

  • 测试 AsyncStorage 是否按预期更新。
  • 测试计时器组件是否按预期更新。

测试 AsyncStorage

我们将首先编写一个测试,测试我们的 AsyncStorage 是否按预期更新。我们将使用 Jest 和 react-native-testing-library 库编写测试。以下代码是测试“time”变量是否被更新并存储在 AsyncStorage 中的示例:

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

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

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

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

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

在此代码中,我们首先导入 React、Timer、AsyncStorage 和测试库,然后仿真 AsyncStorage。我们定义了一个名为“AsyncStorage”的测试套件,它包含一个名为“should update time in async storage every second”的测试。该测试通过调用“render”函数来渲染 Timer 组件。我们创建了一个名为“time”的常量,它包含当前日期的字符串表示形式。我们通过模拟返回该字符串的 AsyncStorage.getItem 方法来设置“time”变量的值。最终,我们通过在 2 秒钟后使用 setTimeout 函数来检查 AsyncStorage.setItem 方法是否被调用,并使用“toHaveBeenCalledWith”函数检查它是否接收了正确的参数。

测试计时器组件

我们将创建的第二个测试将测试计时器组件是否按预期进行更新。以下是示例测试代码:

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

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

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

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

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

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

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

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

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

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

在这个例子中,我们使用 Jest 和 react-native-testing-library 库编写了两个测试:

  • 测试计时器组件是否按预期进行更新。
  • 测试计时器组件是否能够正确呈现。

我们定义了一个名为“Timer”的测试套件,它包含两个测试。第一个测试生成快照并使用“toMatchSnapshot”函数进行比较,以确保组件可以正确呈现。第二个测试呈现 Timer 组件,并使用 AsyncStorage.setItem 函数设置初始时间。然后,我们使用“expect”函数确保 AsyncStorage.getItem 函数被调用,并使用“toEqual”函数确保时间与上次一致。最终,我们使用 while 循环模拟等待 2.5 秒钟,以便检查 AsyncStorage 是否更新了时间。

总结

测试异步更新的视图是 React Native 开发中的一个重要部分。在本文中,我们介绍了如何使用 Enzyme 和 React Native 测试库来测试 AsyncStorage 是否按预期更改,以及如何测试计时器组件是否按预期更新。如果您还没有尝试过使用 Enzyme 进行 React Native 测试,现在是个好时机去尝试一下!

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

纠错
反馈