Jasmine + JSTestDriver +覆盖范围+ RequireJS

Ber*_*rdo 7 javascript js-test-driver requirejs backbone.js jasmine

哇,真是一团糟.这就是场景.

  • 骨干驱动的JS应用程序.
  • RequireJS for AMD功能,初始化如下:

    <script data-main="js/main" src="js/require.js" type="text/javascript"></script>
    
    Run Code Online (Sandbox Code Playgroud)

    然后在main.js里面输入以下配置代码:

    require.config(
    {
        paths:
        {
            ... : ...
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)

    每个Backbone View/Model/Router都是一个"define(...)"模块,并且"require("theOneRouter",...)"在main.js中被调用一次.

  • r.js用作Uglify/Closure的优化器.一个'编译'的main.js是在./release子文件夹中创建的,我在.net框架中动态选择.

  • 花了很长时间才能让Backbone + Require.JS工作,但现在效果很好!

  • 然后在上面拍打Jasmine也需要一些定制工作,但它工作得很好.我必须从我的SpecRunner.html加载require.js,使用require的define(...)调用将每个测试模块定义为AMD,并且通过调用require的require(...)调用一次实例化并运行Jasmine在SpecRunner.html中:

    require(
    [
    //"test/specs/testSpec1",
    "test/specs/views"
    ],
    function ()
    {
        jasmine.getEnv().updateInterval = 1000;
        var reporter = new jasmine.TrivialReporter();
        jasmine.getEnv().addReporter(reporter);
        ....
        ....
    });
    
    Run Code Online (Sandbox Code Playgroud)

    这也太棒了.测试加载和运行,没有问题.要求照顾一切.

现在,我希望像JSTestDriver这样的框架充当我的跑步者.我选择了JSTD,因为它简单,能够在远程浏览器上进行测试,支持代码覆盖,但仍然可以提供其他建议.

JSTestDriver本身工作正常,我唯一的问题是一起运行JSTD + Jasmine + ReuireJS组合.最大的问题是,如果我在配置文件中告诉JSTD关于Jasmine/Require测试模块以加载它,我会收到以下错误:

http://requirejs.org/docs/errors.html#mismatch

如果我使用r.js将我的所有代码优化为一个main.js,则该组合可以工作,包括Coverage,但覆盖范围是在一个巨大的文件上收集的,很难分析.更不用说设备50k行代码的js文件并通过JSTD运行它需要很长时间.

我试图创建一个加载我所有的茉莉花测试模块和代码模块的固定样js文件,但我的回头率上面的"不匹配"的错误,而且,如果我不告诉JSTD有关每个模块独立(通过加载一个html/js fixture执行实际加载)他们不会获得代码覆盖率的检测.

有没有人得到这个特定的组合工作?也许我要求太多了......

小智 4

解决方案正如devadvocate提到的那样。因为 JsTestDriver 和 Require.js 正在竞争管理文件/依赖项的加载,所以当您尝试 100% 以 Require.js 方式(使用匿名模块和定义)执行此操作时,JsTestDriver 会感到不舒服。相反,您必须命名模块并使用 require([...], function(...) {... 而不是 Define([...]。我写了一篇文章,展示了如何集成 QUnit、Requirejs、和 JSTD 的代码覆盖率:js-test-driver+qunit+coverage+requirejs。我在示例中使用 QUnit,但您可以轻松地用 QUnit 替换 Jasmine。在尝试解决这个问题时,我考虑只使用 PhantomJS,但对于我们的用户基础上,我们必须进行跨浏览器测试,IE7、IE8、IE9 等,因此单个 WebKit 是不够的。JsTestDriver 非常有用,但我担心糟糕的文档会让开发人员望而却步。很快我就会'我将在 GitHub 上获取我的示例的代码。希望这会有所帮助。