【问题标题】:Can Blanket.js work with Jasmine tests if the tests themselves are loaded with RequireJS?如果测试本身加载了 RequireJS,Blanket.js 可以与 Jasmine 测试一起使用吗?
【发布时间】:2013-10-16 17:02:56
【问题描述】:

我们已经成功地将 Jasmine 和 RequireJS 一起用于单元测试,现在正在寻求增加代码覆盖率,为此我一直在调查 Blanket.js。我知道它名义上支持 Jasmine 和 RequireJS,并且我能够在 GitHub 上成功使用“jasmine-requirejs”runner,但是这个运行器使用的方法与我们的模型略有不同——即,它加载了测试specs 在 runner.html 中使用 script 标签,而我们的方法是通过 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 混合在一起,我还需要做些什么来触发实际的测试执行吗?可以让 Blanket 与加载测试规范的 RequireJS 一起使用吗?

【问题讨论】:

    标签: requirejs jasmine


    【解决方案1】:

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

    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 事件(由加载的点毯茉莉花已经触发)因此我们需要添加报告并执行“currentRunner”,因为它通常会自行执行。

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

    【讨论】:

    • 谢谢保罗,这让我更接近了。我现在正在尝试通过blanket.options('antifilter', '["Test/", "Scripts/"]'); 设置data-cover-never 等效项,但它似乎没有生效。此外,渲染似乎有点偏离 - Global Total 线未渲染,灰色背景在列出的最终规范中途停止。有什么想法吗?
    • 关于渲染,body 元素的大小似乎与实际内容相去甚远——Chrome 将 body 的底部(没有填充或边距)显示为对应于灰色背景的底部。我们使用 TrivialReporter 而不是 HtmlReporter;我想知道这是否可能是原因?
    • 啊,这都是相关的。由于某些尚未确定的原因,反过滤器无法正常工作,导致检测第三方库(如骨干网)。一旦我调整了过滤器以避免需要反过滤器,因此我只检测我想要的东西,这似乎工作得很好。
    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2016-03-19
    • 2015-01-18
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    相关资源
    最近更新 更多