如果测试本身加载了RequireJS,Blanket.js可以使用Jasmine测试吗?

时间:2013-10-16 17:02:56

标签: requirejs jasmine

我们一直在成功使用Jasmine和RequireJS进行单元测试,现在正在寻求添加代码覆盖率,我一直在调查Blanket.js。我知道它名义上支持Jasmine和RequireJS,并且我能够在GitHub上成功使用“jasmine-requirejs”runner,但是这个跑步者使用的方法与我们的模型略有不同 - 即它加载测试规格在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();
        });
    });

如果我没有毯子或茉莉花毯作为上述功能的依赖,这种方法可以很好地进行单元测试。如果我添加它们(带有require.config路径和shim),我可以验证它们是否已成功获取,但所有看起来发生的事情是我得到jasmine-blanket的jasmine.getEnv().execute重载,它只是打印“等待毯子......“到控制台。没有什么能够触发测试本身再次运行。

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

1 个答案:

答案 0 :(得分: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执行。 Blanket jasmine适配器使用只记录一行的no-op覆盖jasmine.execute,因为它需要暂停执行,直到它在检测到代码后准备开始为止。

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

这应该可以作为一个bug提出,但是现在这种解决方法效果很好。