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

时间:2013-11-14 04:29:34

标签: 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();
    });
});

控制台输出

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

但是当我像这样使用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();
    });
});

使用并运行真实的:

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

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

1 个答案:

答案 0 :(得分:4)

我没有看到你在第二个例子中调用run的位置,但我认为它是在mocks.store [“modules / dependency”]的赋值之后。

我认为这里的问题是你试图存根整个依赖,而不仅仅是run方法。这种方法适用于第一种情况,因为依赖性尚未解决。在第二种情况下,被测模块已经引用了依赖性。因此,替换Squire已经“存储”的副本什么都不做。我相信使用商店的正确方式如下:

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

简而言之,如果你想要替换整个依赖项,那就是mock的用途。 Store仅允许您在受测试代码访问依赖项之前对其进行存根。 (因此,如果测试中的代码是在加载时调用run,而不是在测试时调用,那么你仍然需要使用mock。)

有一种替代方法,对于使用on-load强制您使用mock的情况,您只想在依赖关系可以解析的值上存储一些属性。首先需要依赖,同时你需要Squire。存根需要存根的方法。然后使用mock让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();
    });
});