合理使用 _resetModules 方法避免 Jest 开发中出现依赖缓存问题

阅读时长 5 分钟读完

在 Jest 开发中,我们经常需要利用 Jest 提供的 mock 功能来模拟一些依赖,以便于测试,但是有时候会出现依赖缓存的问题,这就需要我们强制刷新模块的缓存来重新加载模块。而 resetModules 就是 Jest 官方提供的一个方法,用来解决此类问题。

resetModules 方法介绍

resetModules 方法是 Jest 提供的一个内置方法,它用来清除缓存的测试模块,这样下次 require 时就可以重新加载模块。

resetModules 方法有两种使用方式:

  1. 全局调用

    这种方式会清除 Jest 的全局模块缓存。

  2. 模块内调用

    这种方式只会清除当前模块的缓存。

依赖缓存问题

在 Jest 开发中,我们经常使用 mock 功能来进行测试,如下面的示例:

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

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

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

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

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

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

我们在测试 moduleA 的时候,使用了 jest.mock 来模拟了 moduleB,这样就可以测试 moduleA 在不同的输入下的行为。

但是如果我们在测试其他模块的时候也使用了 moduleB,由于 require 的依赖缓存,moduleB 会被直接从 require 的缓存中取出,即使我们在其他地方使用了 jest.mock 也不会起作用。

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

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

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

如上面的示例所示,在测试 moduleC 的时候,我们也用到了 moduleB,但是由于 require 的缓存,使用的是真正的 moduleB 模块,而不是我们在测试 moduleA 时用到的 mock 模块,这会导致测试结果不准确。

为了解决这个问题,我们需要在每次 require 模块前,都调用一次 resetModules 方法,以便于强制刷新模块缓存。

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

这样我们在测试 moduleC 的时候,就可以保证使用的是我们自定义的 mock 模块了。

总结

在 Jest 开发中,我们使用 mock 来模拟依赖,但是由于 require 的缓存,有时候会出现依赖缓存问题,这时我们需要使用 Jest 提供的 resetModules 方法来解决此类问题。在每次 require 模块前,调用 resetModules 方法来清除模块缓存,然后再根据需要进行模拟。

最后,建议在编写测试用例的时候,避免直接引用其他模块,而是使用依赖注入的方式引入模块,这样能够更加清晰地定义模块之间的依赖关系,也能够更好地控制测试过程。

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

纠错
反馈