npm 包 proxyquire-universal 使用教程

简介

proxyquire-universal 是一个用于 Node.js 和浏览器端的测试辅助工具,可以帮助开发者在单元测试中轻松地模拟依赖项。它能够在运行时动态替换 require 语句或 ES6 的 import 语句,使得我们可以使用自定义的 mock 模块来代替真实的依赖项,从而避免了对真实依赖项的依赖,同时也使得测试代码更加可靠和可维护。

安装

可以通过 npm 来安装 proxyquire-universal:

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

使用

基本用法

下面是一个示例代码:

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

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

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

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

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

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

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

在上面的示例代码中,我们使用了 proxyquire-universal 来代替真实的 moment 模块。proxyquire 可以接受两个参数:第一个参数是要加载的模块,第二个参数是一个对象,用于指定要替换的依赖项和它们对应的 mock 模块。

使用 withGlobal()

如果你希望全局地替换某个依赖项,可以使用 withGlobal() 方法。下面是一个示例代码:

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

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

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

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

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

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

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

在上面的示例代码中,我们使用 withGlobal() 方法来创建一个全局的代理,在测试代码中直接给 global 对象添加或修改全局变量 moment 的值,就可以实现全局替换 moment 模块的效果。

使用 with() 和 noCallThru()

如果你使用了 with() 方法来指定要替换的模块,同时还希望在 mock 模块中调用原始模块的方法,可以使用 noCallThru() 方法。下面是一个示例代码:

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

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

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

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

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

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