Jasmine + JSTestDriver +覆盖范围+ RequireJS

时间:2012-05-24 20:54:58

标签: javascript backbone.js requirejs jasmine js-test-driver

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

  • Backbone驱动的JS应用程序。
  • 针对AMD功能的RequireJS,初始化如下:

    <script data-main="js/main" src="js/require.js" type="text/javascript"></script>
    

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

    require.config(
    {
        paths:
        {
            ... : ...
        }
    });
    

    每个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,然后我实例化&amp;在SpecRunner.html中调用一次require要求(...)调用一次运行Jasmine:

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

    这太好用了。测试负载&amp;跑,没问题。需要照顾好一切。

现在,我希望像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文件,它可以加载我所有的Jasmine测试模块和代码模块,但我一直回到上面的“不匹配”错误,并且,如果我不单独告诉JSTD每个模块(通过加载执行真正加载的html / js fixture),他们将不会获得代码检测覆盖。

有没有人让这个特定的组合起作用? 也许我要求太多......

4 个答案:

答案 0 :(得分:4)

解决方案与提到的完全不同。因为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上。希望这会有所帮助。

答案 1 :(得分:2)

我无法让它工作,最终使用PhantomJS来运行我的茉莉花测试。 http://phantomjs.org/

答案 2 :(得分:2)

您是否尝试过在测试中命名模块并在测试中使用require而不是define?

https://github.com/podefr/jasmine-reqjs-jstd

编辑:

我刚刚发布了一个开源工具包,希望能帮助其他人,因为它可以帮助我。它由许多开源工具组成,可以为您提供开箱即用的工作requirejs骨干应用程序。

它提供了单个命令来运行:dev web server,jasmine单浏览器测试运行器,jasmine js-test-driver多浏览器测试运行器,以及JavaScript和CSS的连接/缩小。它还会输出您的应用程序的未分级版本以进行生产调试,预编译您的车把模板,并支持国际化。 无需设置。它只是有效。

它还支持未测试的模块。

http://github.com/davidjnelson/agilejs

答案 3 :(得分:0)

查看此repo(Bredele appolo),这是一个运行Jasmine BDD规范的环境,而不是通过匿名模块加载require.js和JsTestDriver。

如果您正在开发非匿名模块,我还建议您使用podefr解决方案。

奥利弗