简介
proxyquire-universal 是一个用于 Node.js 和浏览器端的测试辅助工具,可以帮助开发者在单元测试中轻松地模拟依赖项。它能够在运行时动态替换 require 语句或 ES6 的 import 语句,使得我们可以使用自定义的 mock 模块来代替真实的依赖项,从而避免了对真实依赖项的依赖,同时也使得测试代码更加可靠和可维护。
安装
可以通过 npm 来安装 proxyquire-universal:
npm install --save-dev proxyquire-universal
使用
基本用法
下面是一个示例代码:
-- -------------------- ---- ------- -- ----- -------- ----- ------ - ------------------ -------- ----------- - ----- ----------- - ------------------------- ----- -------- - ------- -------- ---- -------------- ------ ------ --------- - -------------- - ------
-- -------------------- ---- ------- -- ----- ------------- ----- ---------- - -------------------------------- ----- ------ - ------------------ ----------------- ---------- - ---------- ------ --- ------- ---------- ---------- - ----- ---------- - - ------- -- -- ------- -- ----- ----- - --------------------- - --------- -- -- ---------- --- ----- ------ - -------------- -------------------------- ------- ----- ---- ----- ------- --- ---
在上面的示例代码中,我们使用了 proxyquire-universal 来代替真实的 moment 模块。proxyquire 可以接受两个参数:第一个参数是要加载的模块,第二个参数是一个对象,用于指定要替换的依赖项和它们对应的 mock 模块。
使用 withGlobal()
如果你希望全局地替换某个依赖项,可以使用 withGlobal() 方法。下面是一个示例代码:
-- -------------------- ---- ------- -- ----- -------- ----- ------ - ------------------ -------- ----------- - ----- ----------- - ------------------------- ----- -------- - ------- -------- ---- -------------- ------ ------ --------- - -------------- - ------
-- -------------------- ---- ------- -- ----- ------------- ----- ---------- - --------------------------------------------- ----- ------ - ------------------ ----------------- ---------- - ---------- ------ --- ------- ---------- ---------- - ------------- - - ------- -- -- ------- -- ----- ----- - ---------------------- ----- ------ - -------------- -------------------------- ------- ----- ---- ----- ------- --- ---
在上面的示例代码中,我们使用 withGlobal() 方法来创建一个全局的代理,在测试代码中直接给 global 对象添加或修改全局变量 moment 的值,就可以实现全局替换 moment 模块的效果。
使用 with() 和 noCallThru()
如果你使用了 with() 方法来指定要替换的模块,同时还希望在 mock 模块中调用原始模块的方法,可以使用 noCallThru() 方法。下面是一个示例代码:
-- -------------------- ---- ------- -- ----- -------- ----- ------ - ------------------ -------- ----------- - ----- ----------- - ------------------------- ----- -------- - ------- -------- ---- -------------- ------ ------ --------- - -------------- - ------
-- -------------------- ---- ------- -- ----- ------------- ----- ---------- - --------------------------------------------- ----- ------ - ------------------ ----------------- ---------- - ---------- ------ --- ------- ---------- ---------- - ----- ---------- - - ------- -- -- -------- --------------- ------ -- ------- -- ----- ----- - --------------------- - --------- -- -- ---- - ----------------------------------------------------------- -------- ----------------------------------------------------------------------------------