使用 Jest 进行单元测试时,如何 mock 掉依赖的子模块?

阅读时长 4 分钟读完

在前端开发中,单元测试是非常重要的一环。Jest 是一个流行的 JavaScript 单元测试框架,它提供了很多方便实用的工具和 API,使得编写测试变得更加容易和高效。

在编写单元测试时,我们常常需要 mock 掉一些依赖的子模块,以便更好地控制测试环境和结果。本文将介绍如何使用 Jest 进行子模块的 mock。

基本用法

在 Jest 中,我们可以使用 jest.mock() 方法来 mock 掉子模块。假设我们有一个名为 foo 的模块,它依赖了 bar 模块,我们可以这样 mock 掉 bar 模块:

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

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

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

在上面的示例中,我们使用 jest.mock() 方法来 mock 掉 bar 模块。这个方法接受两个参数,第一个参数是要 mock 的模块路径,第二个参数是一个 mock 函数或一个模块。在这个示例中,我们传入了一个返回固定值的函数来 mock 掉 bar 模块。

在测试 foo 函数时,它会调用 bar 函数,但实际上调用的是我们 mock 掉的函数,因此测试通过。

模块自动 mock

除了手动 mock 模块外,Jest 还提供了一种自动 mock 模块的方式。我们可以在 __mocks__ 目录下创建一个与要 mock 的模块同名的文件,Jest 会自动使用这个文件来 mock 模块。

例如,在上面的示例中,我们可以在项目根目录下创建一个 __mocks__/bar.js 文件来自动 mock bar 模块:

这样,我们就不需要在测试文件中手动 mock bar 模块了,Jest 会自动使用 __mocks__/bar.js 文件来 mock 模块。

模块重置

在某些情况下,我们需要在测试文件中 mock 掉多个模块,但是这些模块之间可能存在相互依赖的关系。为了避免这种情况下的测试错误,我们可以使用 jest.resetModules() 方法来重置所有模块的 mock。

例如,在下面的示例中,我们有两个模块 foobar,它们互相依赖。我们需要在测试文件中 mock 掉这两个模块,但是需要注意它们之间的依赖关系。

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

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

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

在上面的示例中,我们在测试文件中手动 mock 掉 bar 模块,但是我们需要注意 foo 模块依赖 bar 模块。因此我们需要在测试文件中使用 jest.resetModules() 方法来重置所有模块的 mock,然后重新 require bar 模块。这样,我们就可以避免依赖关系带来的测试错误。

总结

在本文中,我们介绍了使用 Jest 进行子模块的 mock 的基本用法和模块自动 mock 的方式。我们还介绍了使用 jest.resetModules() 方法来重置所有模块的 mock,以避免依赖关系带来的测试错误。希望这篇文章对你有所帮助,让你更好地掌握 Jest 单元测试框架。

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

纠错
反馈