1

我们一直在成功地将 Jasmine 和 RequireJS 一起用于单元测试,现在正在寻找添加代码覆盖率,为此我一直在研究Blanket.js。我知道它名义上支持 Jasmine 和 RequireJS,并且我能够成功使用 GitHub 上的“jasmine-requirejs”运行器,但是这个运行器使用的方法与我们的模型略有不同——即,它使用加载测试规范runner.html 中的脚本标签,而我们的方法是通过 RequireJS 加载规范,如下所示(这是我们运行器中 requirejs 调用的回调):

    var jasmineEnv = jasmine.getEnv();
    jasmineEnv.updateInterval = 1000;

    var htmlReporter = new jasmine.TrivialReporter();
    var jUnitReporter = new jasmine.JUnitXmlReporter('../JasmineTests/');

    jasmineEnv.addReporter(htmlReporter);
    jasmineEnv.addReporter(jUnitReporter);

    jasmineEnv.specFilter = function (spec) {
        return htmlReporter.specFilter(spec);
    };

    var specs = [];

    specs.push('spec/models/MyModel');
    specs.push('spec/views/MyModelView');

    $(function () {
        require(specs, function () {
            jasmineEnv.execute();
        });
    });

如果我没有毯子或 jasmine-blanket 作为上述函数的依赖项,这种方法可以很好地用于简单地进行单元测试。如果我添加它们(使用 require.config 路径和 shim),我可以验证它们是否已成功获取,但似乎发生的只是我得到 jasmine-blanket 的过载jasmine.getEnv().execute,它只是打印“等待毯子...... "到控制台。没有什么会触发测试本身再运行。

我知道在我们的方法中没有办法提供通常的data-cover属性,因为 RequireJS 正在执行脚本加载而不是脚本标记,但我希望在这种情况下,Blanket 至少会计算所有内容的覆盖率,而不是什么都没有。是否有一种基于非属性的方式来指定覆盖模式,一旦 jasmine-blanket 混合在一起,我还需要做些什么来触发实际的测试执行吗?可以使毯子与加载测试规范的 RequireJS 一起使用吗?

4

1 回答 1

4

我通过要求毯子茉莉花然后设置选项来完成这项工作

require.config({
    paths: {
        'jasmine': '...',
        'jasmine-html': '...',
        'blanket-jasmine': '...',
    },
    shim: {
        'jasmine': {
            exports: 'jasmine'
        },
        'jasmine-html': {
            exports: 'jasmine',
            deps: ['jasmine']
        },
        'blanket-jasmine': {
            exports: 'blanket',
            deps: ['jasmine']
        }
    }
});

require([
    'blanket-jasmine',
    'jasmine-html',
], function (blanket, jasmine) {
    blanket.options('filter', '...'); // data-cover-only
    blanket.options('branchTracking', true); // one of the data-cover-flags

    require(['myspec'], function() {
        var jasmineEnv = jasmine.getEnv();
        jasmineEnv.updateInterval = 250;
        var htmlReporter = new jasmine.HtmlReporter();

        jasmineEnv.addReporter(htmlReporter);
        jasmineEnv.specFilter = function (spec) {
            return htmlReporter.specFilter(spec);
        };
        jasmineEnv.addReporter(new jasmine.BlanketReporter());
        jasmineEnv.currentRunner().execute();
    });
});

关键行是添加 BlanketReporter 和 currentRunner 执行。一揽子 jasmine 适配器使用仅记录一行的无操作覆盖 jasmine.execute,因为它需要停止执行,直到它准备好开始检测代码后。

通常,BlanketReport 和 currentRunner 执行将由毯子 jasmine 适配器完成,但如果您在 require 中加载毯子茉莉花本身,则启动毯子测试运行器的事件将不会被触发,因为订阅了 window.load 事件(点毯子-jasmine 已加载已触发)因此我们需要添加报告并执行“currentRunner”,因为它通常会自行执行。

这可能应该作为一个错误提出,但目前这种解决方法效果很好。

于 2013-10-18T16:02:00.317 回答