Squire.js在使用商店时不会替换假依赖

sen*_*ett 5 javascript mocking requirejs squirejs

我正在尝试将Squire.js作为RequireJS的依赖加载器.使用完全正常的Web浏览器运行单元测试.我想用来store处理我的嘲笑.但无法阻止Squire加载实际模块.

mock 工作良好:

define(['lib/squire'], function (squire) {
    var injector = new squire();

    injector
    .mock('modules/dependency', {
        run: function () {
            console.log("fake dependency run");
        }
    })
    .require(['modules/module-under-test'], function (module) {
        module.run();
    });
});
Run Code Online (Sandbox Code Playgroud)

控制台输出

module under test loaded       module-under-test.js:2
module under test run          module-under-test.js:5
fake module run                module-test.js:8
Run Code Online (Sandbox Code Playgroud)

但是当我这样使用时store:

define(['lib/squire'], function (squire) {
    var injector = new squire();

    injector
    .store('modules/dependency')
    .require(['modules/module-under-test', 'mocks'], function (module, mocks) {
        mocks.store["modules/dependency"] = {
            run: function () {
                console.log("fake dependency run");
            }
        };
        module.run();
    });
});
Run Code Online (Sandbox Code Playgroud)

使用和运行真实的:

real dependency loaded      dependency.js:2
module under test loaded    module-under-test.js:2
module under test run       module-under-test.js:5
real dependency run         dependency.js:5
Run Code Online (Sandbox Code Playgroud)

Squire在文档的头版上说这是可以的.使用来自Github的最新版本的Squire.js,以及来自requirejs.org的最新RequireJS.我究竟做错了什么?

Ken*_*nic 4

我没有看到您在第二个示例中调用 run 的位置,但我假设它是在分配给 mocks.store["modules/dependency"] 之后。

我认为这里的问题是您试图存根整个依赖项,而不仅仅是运行方法。此方法适用于第一种情况,因为依赖性尚未解决。在第二种情况下,被测模块已经有其对依赖关系的引用。因此,替换 Squire“存储”的副本没有任何作用。我认为正确的使用 store 的方式如下:

mocks.store["modules/dependency"].run = function () {
    console.log("fake dependency run");
};
Run Code Online (Sandbox Code Playgroud)

简而言之,如果您想替换整个依赖项,那么这就是模拟的用途。存储仅允许您在被测试的代码访问依赖项的各个属性之前对其进行存根。(因此,如果被测试的代码要在加载时调用运行,而不是在测试调用时调用,您仍然需要使用模拟。)

对于加载时使用强制您使用模拟但您只想在依赖项将解析为的值上存根一些属性的情况,还有一种替代方法。首先在需要 Squire 的同时需要依赖关系。存根您需要存根的方法。然后使用模拟让 Squire 在解析被测模块的依赖项时使用部分存根的依赖项。在你的情况下,这看起来像:

define(['lib/squire', 'modules/dependency'], function (squire, dep) {
    var injector = new squire();

    dep.run = function () {
        console.log("fake dependency run");
    };

    injector
    .mock('modules/dependency', dep)
    .require(['modules/module-under-test'], function (module) {
        module.run();
    });
});
Run Code Online (Sandbox Code Playgroud)