Jasmine + JSTestDriver + Coverage + RequireJS

Jasmine + JSTestDriver + Coverage + RequireJS

本文关键字:RequireJS Coverage JSTestDriver Jasmine      更新时间:2023-09-26

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

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

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

    然后在 main 中.js以下配置代码:

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

    每个主干视图/模型/路由器都是一个"定义(...)"模块,并且"require("theOneRouter",...)"在main.js中被调用一次。

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

  • 花了相当长的时间让骨干 + 需求.JS工作,但现在工作得很好!

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

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

    这也很好用。测试加载和运行,没有问题。需要照顾一切。

现在,我希望像JSTestDriver这样的框架充当我的运行器。我选择 JSTD 是因为它简单、能够在远程浏览器上进行测试、代码覆盖率支持,但我仍然愿意接受其他建议。

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

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

如果我使用 r.js 将所有代码优化为一个主.js,则组合有效,包括覆盖率,但覆盖率收集在一个巨大的文件中并且难以分析。更不用说检测一个 50k 行代码的 js 文件并通过 JSTD 运行它需要很长时间。

尝试创建一个类似夹具的js文件来加载我所有的Jasmine测试模块和代码模块,但是我一直回到上面的"不匹配"错误,而且,如果我不单独告诉JSTD每个模块(通过加载执行实际加载的html/js夹具),它们将不会检测代码覆盖率。

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

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

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

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

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

编辑:

刚刚发布了一个开源工具包,希望它能帮助其他人,就像它帮助我一样。它是许多开源工具的组合,为您提供了一个开箱即用的 requirejs 主干应用程序。

它提供了单个命令来运行:dev Web server,jasmine Single browser test runner,jasmine js-test-driver multi browser test runner,以及 JavaScript 和 CSS 的串联/缩小。它还输出应用的未缩小版本以进行生产调试,预编译车把模板,并支持国际化。无需设置。它只是工作。

它还支持待测的未命名模块。

http://github.com/davidjnelson/agilejs

看看这个存储库(Bredele appolo),它是一个在加载了require.js和JsTestDriver的匿名模块上运行Jasmine BDD规范的环境。

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

奥利维尔