Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 茉莉花&x2B;JSTestDriver+;覆盖范围+;安魂曲_Javascript_Backbone.js_Requirejs_Jasmine_Js Test Driver - Fatal编程技术网

Javascript 茉莉花&x2B;JSTestDriver+;覆盖范围+;安魂曲

Javascript 茉莉花&x2B;JSTestDriver+;覆盖范围+;安魂曲,javascript,backbone.js,requirejs,jasmine,js-test-driver,Javascript,Backbone.js,Requirejs,Jasmine,Js Test Driver,哇,真是一团糟。情况就是这样 主干驱动的JS应用程序 AMD功能的RequireJS,初始化如下: <script data-main="js/main" src="js/require.js" type="text/javascript"></script> 每个主干视图/模型/路由器都是一个“define(…)”模块,“require”(“theOneRouter”),在main.js中调用一次 r、 js用作优化器,带有Uglify/Closure。在./rel

哇,真是一团糟。情况就是这样

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

    <script data-main="js/main" src="js/require.js" type="text/javascript"></script>
    
    每个主干视图/模型/路由器都是一个“define(…)”模块,“require”(“theOneRouter”),在main.js中调用一次

  • r、 js用作优化器,带有Uglify/Closure。在./release子文件夹中创建了一个“compiled”main.js,我在.net framework中动态选择该子文件夹

  • 主干网+Require.JS运行了相当长的时间,但现在效果很好

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

    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组合。最大的问题是,如果为了加载Jasmine/Require测试模块而在配置文件中告诉JSTD,我会得到以下错误:

如果我使用r.js将我所有的代码选择到一个main.js中,那么这种组合是有效的,包括覆盖率,但是覆盖率收集在一个巨大的文件中,很难分析。更不用说插入一个50k行代码js文件并通过JSTD运行它需要很长时间

我试着创建一个像js文件这样的装置来加载我所有的Jasmine测试模块和代码模块,但我一直返回到上面的“不匹配”错误,并且,如果我不单独告诉JSTD每个模块的情况(通过加载一个真正加载的html/js装置),它们就不会被检测到代码覆盖率

有人把这种特殊的组合用在工作上了吗?
也许我要求的太多了…

我没能让它工作,结果用PhantomJS来运行我的jasmine测试

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

编辑:

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

它提供了单个命令来运行:devweb服务器、jasmine单浏览器测试运行程序、jasmine js测试驱动程序多浏览器测试运行程序,以及JavaScript和CSS的concatenation/minification。它还输出应用程序的未统一版本以进行生产调试,预编译把手模板,并支持国际化。 不需要设置。它只是工作

它还支持测试中未命名的模块


解决方案正是devadvocate提到的。由于JsTestDriver和Require.js正在竞争管理文件/依赖项的加载,因此当您尝试100%使用Require.js方式(使用匿名模块和定义)进行加载时,JsTestDriver会遇到麻烦。相反,您必须命名模块并使用require([…],function(…){…而不是define([…]。我写了一篇文章,展示了如何将QUnit、Requirejs和代码覆盖率与JSTD集成:。在我的示例中,我使用QUnit,但你可以很容易地用QUnit代替Jasmine。为了解决这个问题,我考虑了只使用PhantomJS,但对于我们的用户群来说,我们必须进行跨浏览器测试,IE7、IE8、IE9等,因此一个WebKitldn't cut it.JsTestDriver非常有用,但我担心糟糕的文档会让开发人员望而却步。很快,我会在GitHub上获得我的示例代码。希望这会有所帮助。

查看此repo(),它是一个在加载了require.js和JsTestDriver的匿名模块上运行Jasmine BDD规范的环境

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


Olivier

我考虑过PhantomJS,但JSTD的重点是运行跨平台单元测试,PhantomJS不支持作为无头web工具包。我想这会引出一个问题:是否有必要在无头环境中运行单元测试,而只关注运行集成/验收测试在类似Selenium的跨浏览器环境中?我为跨浏览器运行单元测试构建了自己的解决方案。我不自动执行此过程,但您可以轻松地扩展解决方案以实现此目的。下面是我的博客帖子-->的链接经过几周的试验,我仍然相信单元测试应该在浏览器环境中运行,而不是在浏览器环境中运行出于这个原因,我一直在试验Selenium和托管的SauceLabs解决方案,到目前为止,大部分都能正常工作。我唯一的挫折是代码覆盖率:JSTD有很好的平滑集成的覆盖工具和报告,我似乎找不到一个比较智能的工具来定制旋转环境。感谢您的输入,goo是的,你的观点是对的,我已经尝试手动命名我的模块,并使用require调用而不是define()s、 但这不是一个可行的解决方案:即使是自动化的,它也需要在每次测试运行之前执行大量额外的工作,为了在开发过程中快速运行测试,我希望避免这一点。因此,我现在有一个补丁版本的jsTestDriver.jar,它允许通过正则表达式使用文件。它还允许JavaScript文件将从“服务”部分加载。服务JavaScript源文件意味着在浏览器页面加载时不会自动执行这些文件。相反,当浏览器执行require.js时,require可以
require(
[
//"test/specs/testSpec1",
"test/specs/views"
],
function ()
{
    jasmine.getEnv().updateInterval = 1000;
    var reporter = new jasmine.TrivialReporter();
    jasmine.getEnv().addReporter(reporter);
    ....
    ....
});