如果测试本身加载了RequireJS,那么Blanket.js能否与Jasmine测试一起工作?

如果测试本身加载了RequireJS,那么Blanket.js能否与Jasmine测试一起工作?,requirejs,jasmine,Requirejs,Jasmine,我们已经成功地将Jasmine和RequireJS一起用于单元测试,现在正在寻找增加代码覆盖率的方法,为此我一直在进行调查。我知道它名义上支持Jasmine和RequireJS,并且我能够在GitHub上成功地使用“Jasmine RequireJS”,但是这个运行程序使用的方法与我们的模型略有不同——即,它使用runner.html中的脚本标记加载测试规范,而我们的方法是通过RequireJS加载规范,如下所示(这是运行程序中requirejs调用的回调): 如果我没有毯子或茉莉花毯子作为上述

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

如果我没有毯子或茉莉花毯子作为上述函数的依赖项,那么这种方法可以很好地用于简单的单元测试。如果我添加它们(使用require.config路径和shim),我可以验证它们是否已成功获取,但所发生的一切似乎是我获得了jasmine blanket的
jasmine.getEnv()。没有任何东西会触发测试本身的运行


我确实知道,在我们的方法中,无法提供通常的
数据覆盖
属性,因为RequireJS正在进行脚本加载,而不是脚本标记,但我希望在这种情况下,Blanket至少会计算所有内容的覆盖率,而不是什么都没有。是否有一种非基于属性的方法来指定覆盖模式,并且在jasmineblanket加入混合后,是否还需要做其他事情来触发实际的测试执行?橡皮布可以与加载测试规范的RequireJS一起工作吗?

我通过要求橡皮布茉莉花然后设置选项来实现这一点

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 execute的添加。Blanket jasmine适配器使用只记录一行的no op重写jasmine.execute,因为它需要停止执行,直到在插入代码后准备好开始执行为止

通常,BlanketReport和currentRunner的执行将由blanket jasmine适配器完成,但如果您在require中加载blanket jasmine本身,则启动blanket test runner的事件不会在订阅window.load事件时触发(加载blanket jasmine时,该事件已经触发)因此,我们需要添加报告并执行“currentRunner”,因为它通常会自行执行


这可能是一个bug,但现在这个解决方法很好。

我通过要求毯子茉莉花然后设置选项来实现这一点

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 execute的添加。Blanket jasmine适配器使用只记录一行的no op重写jasmine.execute,因为它需要停止执行,直到在插入代码后准备好开始执行为止

通常,BlanketReport和currentRunner的执行将由blanket jasmine适配器完成,但如果您在require中加载blanket jasmine本身,则启动blanket test runner的事件不会在订阅window.load事件时触发(加载blanket jasmine时,该事件已经触发)因此,我们需要添加报告并执行“currentRunner”,因为它通常会自行执行


这可能是一个bug,但现在这个解决方法很好。

谢谢Paul,这让我更接近了。我现在正试图通过
blanket.options('antiffilter',“[“Test/”,“Scripts/”])设置
数据覆盖永不
等价物但它似乎没有生效。此外,渲染似乎有点不对劲——全局总行没有渲染,灰色背景在列出的最终等级库中间停止。有什么想法吗?关于渲染,body元素的大小似乎与实际内容不符——Chrome显示了body的底部(没有填充或边距),与灰色背景的底部相对应。我们正在使用琐碎的Reporter而不是HtmlReporter;我不知道这是否是原因?啊,都是相关的。由于某些尚未确定的原因,反过滤器不起作用,导致第三方LIB(如主干)的检测。有一次,我调整了过滤器,以避免使用反过滤器,这样我就只需要安装我想要的东西,这看起来效果很好。谢谢保罗,这让我离得更近了。我现在正试图通过
blanket.options('antiffilter',“[“Test/”,“Scripts/”])设置
数据覆盖永不
等价物但它似乎没有生效。此外,渲染似乎有点不对劲——全局总行没有渲染,灰色背景在列出的最终等级库中间停止。有什么想法吗?关于渲染,body元素的大小似乎与实际内容不符——Chrome显示了body的底部(没有填充或边距),与灰色背景的底部相对应。我们正在使用琐碎的Reporter而不是HtmlReporter;我不知道这是否是原因?啊,都是相关的。由于某些尚未确定的原因,反过滤器不起作用,导致第三方LIB(如主干)的检测。一旦我调整了我的过滤器以避免使用反过滤器,这样我就只需要安装我想要的东西,这看起来非常有效。