1

我为我在Dojo Toolkit 1.9之上开发的代码(服务器和客户端)编写了一系列为Intern 1.4编写的基本测试。

现在我想单独测试类,使用模拟对象而不是 AMD 加载程序自动解析的依赖项。

这是一组依赖于 'aa' 的带有 'bb' 的类,带有 'aa' 类的模拟,以及我想要验证的测试用例。

/* file <root>/aa.js */
define([], function() {
    return {
        get: function() { return 'aa' }
    };
});

--

/* file <root>/bb.js */
define([ './aa' ], function(aa) {
    return {
        get: function() { return aa.get() + '-bb' }
    };
});

--

/* file in <root>/tests/aaMock.js */
define([], function() {
    return {
        get: function() { return 'aaMock' }
    };
});

--

/* file in <root>/tests/aaTest.js */
define([ 'intern!object', 'intern/chai!assert', '../bb',  ], function (registerSuite, assert,  bb) {
    registerSuite({
        name: 'testbed',

        'bb untouched': function() {
            assert.strictEqual('aa-bb', bb.get());
        },

        'bb with mocked aa': function () {
            require(
                { map: { '*': { 'aa': '<pkg>/tests/aaMock' } } },
                [ '<pkg>/bb' ],
                function(bb) {
                    assert.strictEqual('aaMock-bb', bb.get());
                }
            );
        }
    });
});

从上面的测试文件中,Intern 报告了一项成功的测试和一项失败的测试。就我能够跟踪 Dojo 加载程序(Dojo 2 与 Intern 打包)而言,“bb”模块的第二个引用来自加载程序缓存。

问题:

  • 这是正确的方法吗?或者我应该使用一种方法来检测“bb”类,该injectMock()方法将使用给定的“aaMock”引用覆盖“aa”类的本地引用?
  • 我读到 RequireJS 缓存可以用flags无效contexturlArgs。我们可以用 Dojo 加载器做类似的事情吗?

请注意,我没有故意使用上下文相关的要求,因为它不接受新配置。

谢谢, 多姆

4

1 回答 1

2

在等待 Intern 1.5 及其require.undef功能时,我决定采用以下injectMock()方法:

  • injectMock()如果has("mockable-api")为真,则要测试的类公开一个方法。
  • 只有我的实习生配置电话has("mockable-api", true);

有个小技巧:

  • Intern 配置依赖intern/node_modules/dojo/has(因为它不知道我自己的 Dojo 工具包副本在哪里);
  • 我的班级依赖于相同的依赖关系。如果它依赖dojo/has(我的 Dojo 本地副本中的那个),它永远不会得到真实的has("mockable-api")
  • 为了能够在浏览器中运行相同的类,我dojoConfig使用映射替换了对 Intern 的依赖项来检测定义:

    dojoConfig = {
        has: { 'mockable-api': false },
        packages: [{ name: 'dojo', location: '/libs/dojo' }, ... ],
        map: { '*': { 'intern/node_modules/dojo/has': 'dojo/has' } }
    }
    

现在每个测试用例都可以注入替换原始依赖项的模拟。然后,即使是处理 DOM 的测试(例如,通过dojo/domdojo/dom-construct)也可以单独工作。

Intern 报告的唯一奇怪行为与 AMD 加载程序识别的一些循环依赖关系有关,如下所示dojo/dom-construct。希望它不会影响我的测试......

Circular dependency: *11 -> tests/allTests -> controllers/tests/mainTest -> controllers/main.js -> dojo/dom-construct -> dojo/dom-attr -> dojo/dom-prop -> dojo/dom-construct

于 2014-02-26T15:52:14.693 回答