Mocha + BlanketJS + RequireJS,没有方法'记者'

时间:2013-12-24 03:02:35

标签: javascript requirejs code-coverage mocha blanket.js

我正在使用带有RequireJS的Mocha并且测试运行正常,但是,当我尝试添加一揽子代码覆盖时,我得到Uncaught TypeError: Object #<HTMLDivElement> has no method 'reporter'

这是我正在运行的代码:

<div id="mocha"></div>

<script src="../src/js/vendor/requirejs/require.js"></script>

<script src="../src/js/vendor/blanket/dist/qunit/blanket.js"
data-cover-adapter="../src/js/vendor/blanket/src/adapters/mocha-blanket.js"></script>

<script src="SpecRunner.js" data-cover></script>

和我的specrunner:

require(["../src/js/require-config.js"], function () {

// Set testing config
require.config({
    baseUrl: "../src/js",
    paths: {
        "mocha": "vendor/mocha/mocha",
        "chai": "vendor/chai/chai"
    },
    urlArgs: "bust=" + (new Date()).getTime()
});

require([
    "require",
    "chai",
    "mocha"
], function (require, chai) {
    var should = chai.should();
    mocha.setup("bdd");

    require([
        "specs.js",
    ], function(require) {
        if (window.mochaPhantomJS) {
            mochaPhantomJS.run();
        } else {
            mocha.run();
        }
    });

});

});

就像我说的那样 - 我的测试都运行良好,我只是无法弄清楚为什么毯子不起作用。

更新

我可以通过在开始时包含mocha的脚本标记来运行它,但是,现在它运行mocha测试两次。

3 个答案:

答案 0 :(得分:0)

您使用RequireJS的方式存在问题。如果您使用RequireJS加载代码并使用<script>标记加载代码,并且:

  • 这两组代码并不相互依赖,您可以按任何顺序加载它们。

  • 加载<script>的代码取决于RequireJS加载的代码,然后您应该将加载了<script>的代码转换为要加载的RequireJS。如果不这样做,则会遇到间歇性故障。

  • 使用RequireJS加载的代码取决于加载<script>的代码,然后加载<script>的代码必须在开始使用RequireJS加载代码之前加载并执行。

    < / LI>

从查看Blanket的文档,我确定你的案例是第二个。在开始使用RequireJS加载模块之前加载Blanket适配器,但是适配器希望Mocha存在已经

您必须使用shim。我无法确定您使用的确切垫片(因为我不使用毯子),但这样的事情可以帮助您朝着正确的方向前进:

shim: {
    "blanket": {
        exports: "blanket"
    },
    "mocha-blanket": ["mocha", "blanket"]
}

显然,"blanket""mocha-blanket"名称必须根据您的情况进行调整。我认为适配器本身不需要exports值,因为适配器将自身附加到Mocha而不是在全局空间中导出。

答案 1 :(得分:0)

我弄清楚了并且写了一篇关于让Blanket与AMD的Mocha合作的报道。 Here's a blog post概述了该过程以及repo with the working code

我正在使用以下内容加载我的测试:

require(["../src/js/require-config"], function () {

  require.config({
    baseUrl: "../src/js",
    paths: {
        chai: "vendor/chai/chai"
    }
  });

  require([
    "chai"
  ], function (chai) {
    chai.should();
    window.expect = chai.expect;
    mocha.setup("bdd");

    require([
        "specs.js"
    ], function () {
        mocha.run();
    });
  });

});

然后是页面上的以下代码:

<div id="mocha"></div>

<script src="../src/js/vendor/mocha/mocha.js"></script>

<script data-main="main-tests" src="../src/js/vendor/requirejs/require.js"></script>

<script src="../src/js/vendor/blanket/dist/qunit/blanket.js" data-cover-only="../src/js/component"></script>
<script type="text/javascript" src="../node_modules/grunt-blanket-mocha/support/mocha-blanket.js"></script>

<script>
/* global blanket */
if (window.PHANTOMJS) {
    blanket.options("reporter", "../node_modules/grunt-blanket-mocha/support/grunt-reporter.js");
}
</script>

答案 2 :(得分:0)

毯子上发布的摩卡适配器不起作用。

使用bower bower install blanket#master --save-dev

安装尚未发布的版本

此外,脚本包含事项的顺序

<script src="mocha.js"></script>
<script>mocha.setup('bdd');</script>
<script data-main="config.js" src="../bower_components/requirejs/require.js"></script>
<script src="../bower_components/blanket/dist/qunit/blanket.js" data-cover-never="bower_components"></script>
<script src="../bower_components/blanket/src/adapters/mocha-blanket.js"></script>