在 Jest 开发中,我们经常需要利用 Jest 提供的 mock 功能来模拟一些依赖,以便于测试,但是有时候会出现依赖缓存的问题,这就需要我们强制刷新模块的缓存来重新加载模块。而 resetModules 就是 Jest 官方提供的一个方法,用来解决此类问题。
resetModules 方法介绍
resetModules 方法是 Jest 提供的一个内置方法,它用来清除缓存的测试模块,这样下次 require 时就可以重新加载模块。
resetModules 方法有两种使用方式:
全局调用
jest.resetModules();
这种方式会清除 Jest 的全局模块缓存。
模块内调用
jest.resetModules(); const moduleA = require('../moduleA');
这种方式只会清除当前模块的缓存。
依赖缓存问题
在 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