Jest 中 Mocks 的高级用法

阅读时长 5 分钟读完

在前端开发过程中,我们常常需要测试我们的代码。而在测试过程中,我们有许多需要模拟的依赖项,例如网络请求、数据存储、系统时间等等。这时候,Jest 提供的 Mock 功能就非常重要了。

在 Jest 中,我们可以使用 Mocks 来模拟一个依赖项的行为,并且在测试中使用这个 Mock 代替实际依赖项。这可以帮助我们更方便的编写测试用例并且避免不必要的网络请求、文件操作等开销。下面,我们将会介绍 Jest 中 Mocks 的高级用法。

基本使用

在 Jest 中,我们可以使用以下两种方式来创建一个 Mock:

手动创建 Mock

手动创建 Mock 的方式非常简单,我们只需使用 Jest 提供的 jest.fn() 方法,如下所示:

这个 Mock 将会代替我们的实际函数,并且记录它的调用情况以及参数。在测试用例中,我们可以调用这个 Mock,对其进行断言,例如:

自动创建 Mock

除了手动创建 Mock 外,Jest 还提供了一种自动创建 Mock 的方式。当我们通过 jest.mock() 方法来 mock 一个依赖时,Jest 会帮我们自动创建一个 Mock,如下所示:

通过这种方式,我们就可以将 myDependency 这个依赖项的行为进行模拟,例如:

这里我们将 myDependency 设置为一个 Mock 实现,并断言调用后返回 'mocked'。

高级用法

除了 Jest 的基本 Mock 功能以外,还有一些更高级的用法,让我们能够更方便地编写测试用例。

模拟模块

在某些情况下,我们需要模拟一个模块的行为。例如,我们需要模拟一个 HTTP 模块来模拟 API 请求的行为。我们可以通过以下方式来模拟模块:

这里我们通过 jest.mock 方法来模拟 axios 模块,通过回调函数返回一个 get 方法的 Mock 实现,来模拟 HTTP 请求的返回。在测试用例中,我们可以对 axios.get 这个 Mock 进行断言,来确保其发生了我们期望的调用:

Mock 命名空间

有时候,我们需要在一个模块中 mock 多个依赖项。为了避免 Mock 发生冲突,我们可以使用 Mock 命名空间来分别定义 Mock。例如:

这里我们定义了一个名为 myDependency 的 Mock 命名空间,我们可以在其中定义多个 Mock。在测试用例中,我们可以对这个命名空间下的 Mock 进行断言,例如:

自动模块 Mock

有时候我们需要模拟一个模块,但是这个模块没有定义导出,而是通过依赖注入的方式来使用。此时,我们可以使用 Jest 提供的自动模块 Mock 功能来模拟这个模块的返回值。例如:

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

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

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

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

这里我们使用 jest.mock 方法来模拟 myDependency 模块,模拟其返回的 func1 方法的返回值为 'mocked'。在测试用例中,我们调用 myModule('param1') 方法并对其返回值进行断言,由于 myModule 中使用了 myDependency 模块,所以我们在测试用例中调用的是 Mock 后的版本。

总结

Jest 中的 Mock 功能是非常强大的,使用 Mock 可以帮助我们更方便地编写测试用例以及避免不必要的开销。在本文中,我们介绍了 Jest 中 Mock 的基本用法以及几种高级用法。建议在编写 Jest 测试用例时,多加尝试使用 Mock 功能。

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

纠错
反馈