使用 Jest 对 Node.js 应用进行单元测试的最佳实践

阅读时长 7 分钟读完

单元测试是前端开发中不可或缺的一环,它可以提供对代码的质量、正确性和可维护性的保障。在 Node.js 应用中,Jest 是一个功能强大且易于使用的单元测试框架。在本文中,我们将介绍如何使用 Jest 进行 Node.js 应用的单元测试,并探索一些最佳实践。

安装 Jest

要使用 Jest,你需要先安装它。可以使用 NPM 进行安装,只需在终端中运行以下命令:

此命令将 Jest 安装为开发依赖项,并将其添加到 devDependencies 选项中。

编写单元测试

一旦安装了 Jest,你就可以开始编写单元测试了。单元测试是以测试用例的形式存在的,每个测试用例都应该覆盖一个代码路径。测试用例应该独立于其他测试用例,以便可以单独运行它们,并且应该对代码的所有方面进行测试,包括成功和失败的情况。

以下是一个简单的示例,演示如何编写测试用例。我们将编写一个函数 sum,该函数将两个数字相加并返回结果。然后我们将编写一个测试用例,以确保此函数正常工作:

在上述示例中,我们编写了一个函数 sum 来执行数字相加并将结果返回。我们还编写了一个测试用例,以确保 sum 函数正常工作。在测试用例中,我们使用了 Jest 提供的 expect 函数来测试 sum 函数的输出。我们使用 toBe 方法来比较 sum(1, 2) 的输出是否等于 3。

运行 Jest

一旦编写了测试用例,就可以运行 Jest 来执行测试。在终端中,只需运行以下命令:

这将自动运行所有的测试用例。Jest 运行测试时,它会查找所有以 .test.js.spec.js 结尾的文件,并使用它们作为测试用例运行。

测试实践

使用模拟

在某些情况下,我们希望测试某个函数,但是由于它依赖于其他模块或库,因此很难进行测试。在这种情况下,使用模拟是一个好的选择。可以使用 Jest 提供的 jest.fn() 来创建模拟函数,以便在测试中代替实际函数。

以下是一个示例,演示如何对依赖于其他模块的函数进行测试。我们将编写一个函数 reverseString,该函数使用 lodash 库中的方法来反转字符串。然后我们将创建一个模拟的 lodash 库,以便在测试中代替实际库:

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

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

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

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

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

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

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

在上述示例中,我们使用 Jest 的 mocking 功能来创建了一个模拟的 lodash 库,并将其用于测试。我们通过调用 jest.mock 方法来创建模拟库,然后在测试用例中使用它来代替实际库。在测试用例中,我们测试了 reverseString 函数的输出,并确保它在内部使用了正确的库方法。

使用 beforeEach 和 afterEach

在某些情况下,测试用例之间的状态可以相互影响,从而导致测试出现问题。为了避免这种情况,可以使用 Jest 提供的 beforeEachafterEach 函数,以便在运行每个测试用例之前和之后执行一些操作。

以下是一个简单的示例,演示如何使用 beforeEachafterEach 函数来避免测试状态上的相互干扰。在这个例子中,我们将创建一个计数器,每次调用时它都会增加 1。我们将编写两个测试用例,一个测试用例将调用计数器,另一个测试用例将不调用,以确保计数器正常工作:

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

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

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

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

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

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

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

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

在上述示例中,我们创建了一个简单的计数器,该计数器在全局命名空间中定义。然后,我们编写两个测试用例,其中一个测试用例在 beforeEach 函数中调用计数器,而另一个测试用例不调用。在每个测试用例之前,我们都将计数器的初始值设置为 0,以便每个测试用例都可以独立运行。

使用快照测试

有时候,我们需要测试一些与 UI 相关的代码,比如说 React 组件。为了测试这些代码,可以使用 Jest 的快照测试功能,以便比较组件的输出。在快照测试中,Jest 会自动将组件的输出与预期输出进行比较,并在输出不匹配时显示差异。

以下是一个示例,演示如何使用 Jest 的快照测试功能来测试 React 组件。我们将编写一个简单的 Button 组件,并使用 Jest 的 toMatchSnapshot() 方法来比较组件的输出。这个方法会创建一个快照文件,并在下一次测试运行时与当前组件的输出进行比较:

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

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

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

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

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

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

在上述示例中,我们创建了一个简单的 Button 组件,并使用 Jest 的 create 方法来创建组件快照。然后,我们使用 toMatchSnapshot() 方法来比较组件的输出与预期输出。如果组件输出匹配预期输出,则测试通过。

总结

在本文中,我们介绍了使用 Jest 进行 Node.js 应用的单元测试的最佳实践。我们探索了一些实用的技巧,包括使用模拟、使用 beforeEach 和 afterEach、使用快照测试等。希望这些内容能够为你提供有价值的帮助,让你写出更加健壮的代码。

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

纠错
反馈