使用 Jest Mock 函数测试异步代码的正确方法

阅读时长 5 分钟读完

在前端开发中,我们常常需要测试异步代码。这些代码可能包括发起网络请求、处理定时器或事件等等。然而,由于异步代码的不确定性和难以追踪,测试异步代码往往是一件比较棘手的事情。在这篇文章中,我们将介绍如何使用 Jest Mock 函数来测试异步代码,以及几个需要注意的问题。

Jest Mock 函数简介

Jest Mock 函数是 Jest 提供的一种模拟函数的方式。Mock 函数可以模拟任何函数的行为,并且可以进行测试时的调用检查。使用 Mock 函数可以方便地解决一些测试中的问题,比如测试复杂的函数、解耦依赖、模拟异步行为等。

在 Jest 中,使用 Mock 函数有两种方式:

  1. 创建 Mock 函数
  2. 使用 Jest 提供的自动 Mock 功能

下面我们将一步步介绍这两种方式。

1. 手动创建 Mock 函数

手动创建 Mock 函数的方式,需要我们手工编写一个 Mock 函数,它的行为和被模拟的函数相似。创建 Mock 函数的代码如下所示:

我们可以将这个 Mock 函数传递给需要进行测试的函数中,来检查函数调用时,是否正确调用了 Mock 函数。

下面我们将使用手动创建 Mock 函数的方式来测试一个简单的异步函数。

示例代码

假设我们有一个异步函数 getData,它通过网络请求获取数据。我们需要测试这个函数是否正确的获取了数据并返回了它。

我们可以将这个异步函数传递给测试函数中,并创建一个 Mock 函数模拟 axios.get 方法的返回值。

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

------------- ------ ------ ------ ----- -- -- -
  -- -- ---- --
  ----- -------- - - ----- ----- ----- --
  ----- ------- - ----------------- -----------------------------------
  -- --------------
  ----- ------ - ----- ----------
  ------------------------------
  -- -- ---- -------
  -----------------------------------
  -- -- ---- -------
  ----------------------
---
展开代码

在这个测试中,我们使用了 jest.spyOn 方法来创建了一个 Mock 函数,模拟了 axios.get 方法的返回值,然后在测试函数中调用 getData 函数,并使用 expect 断言来检查返回值和 Mock 函数是否被调用。

2. 使用 Jest 自动 Mock 功能

使用 Jest 的「自动 Mock」功能,是 Jest 提供的另一种 Mock 方法。当 Jest 检测到我们测试的模块包含外部依赖时,会自动为这些依赖创建 Mock 函数。

例如,我们有一个模块依赖 axios 模块,并使用 axios.get 方法获取数据。如果我们想要对这个模块进行测试,我们可以使用 Jest 提供的自动 Mock 功能,不需要手动创建 Mock 函数。

示例代码

这个模块 axios.js 包含了一个 axios.get 方法,并通过 request 方法将其暴露给外部调用。

我们可以在测试函数中使用 jest.mock 方法来自动 Mock axios 模块并返回预期值。然后,我们就可以调用被测试的函数并使用 expect 断言检查返回值是否符合预期。

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

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

------------- ------ ------ ------ ----- -- -- -
  ----- ------ - ----- ----------
  ------------------------ ----- ----- ----- ---
---
展开代码

在这个测试中,我们使用了 jest.mock 方法来自动 Mock axios 模块。在传递函数时,我们使用了 mockImplementation 方法来返回希望被测试函数获得的数据。最后,我们使用 expect 断言检查返回的值是否符合预期。

注意事项

  1. 在 Mock 函数中,mockImplementation 方法用于指定函数被调用时所执行的回调函数。
  2. Mock 函数可以用来模拟任何函数,包括异步函数和返回 promise 的函数。
  3. 每个测试用例都应该在测试结束前还原 Mock 函数原本的行为。
  4. 在模拟异步函数时,应该使用 .resolves.rejects 方法,以确保我们的异步函数被正确地包装为 promise。

总之,使用 Jest Mock 函数来测试异步代码是非常有效的。通过使用 Jest 提供的自动 Mock 或手动创建模拟函数的方式,我们可以方便地测试各种异步场景,提高我们测试的效率。

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

纠错
反馈

纠错反馈