无法通过Chutzpah获得简单的AngularJS Jasmine测试

时间:2016-04-20 04:19:50

标签: angularjs visual-studio unit-testing jasmine chutzpah

我有一个非常简单的jasmine单元测试,目标是在AngularJS控制器上测试一个简单的操作,如下所示:

/// <reference path="../src/jasmine.js"/>
/// <reference path="../../Scripts/angular.js"/>
/// <reference path="../../Scripts/angular-mocks.js"/>
/// <reference path="../../Scripts/angular-ui-router.js"/>
/// <reference path="../../Scripts/angular-route.js"/>
/// <reference path="../../Scripts/angular-resource.js"/>
/// <reference path="../../Scripts/angular-ui/ui-bootstrap.js"/>
/// <reference path="../../app/app.js"/>
/// <reference path="../../app/controllers/myController.js"/>

describe("my Controller", function () {

   var scope, ctrl, vm;

   beforeEach(module("app"));

   beforeEach(inject(function ($controller, $rootScope) {
      scope = $rootScope.$new();
      ctrl = $controller(MyController, { $scope: scope });
      vm = ctrl;
   }));

   it("sets the title", function() {          
      expect(vm.title).toBe("This is the title");
   });


});

使用以下任一项时,要开始上述测试 传递

  • 打开SpecRunner.html,其中包含相同的引用,并在jasmine默认测试运行器中显示传递单元测试
  • 如果通过ReSharper测试运行器运行,则无需修改即可进行测试(除了使用其他测试运行器显示测试通道之外,此工具不重要;测试不是罪魁祸首)

然而,无论何时使用Chutzpah执行以下任何操作,测试都会失败:

  • 使用chutzpah.console.exe
  • 从命令行运行
  • 使用VS.NET中打开的右键菜单运行JS测试

每次出现以下错误:

  

错误:[$ injector:modulerr]无法实例化模块   app由于:[$ injector:nomod]模块   'app'不可用!你要么拼错了   模块名称或忘记加载它。如果注册模块,请确保   您将依赖项指定为第二个参数。

因此,如果AngularJS引用,则这是一个非常典型的错误。但是正如你在上面看到的那样,肯定会包含它们,其他测试运行者会看到它们和测试通过。无论我是从命令行运行单元测试还是在VS.NET中查看输出,错误都是相同的。

我甚至从命令行打开了/trace参数并查看了chutzpah.log文件。确实找到了Angular参考文件,所以我不确定测试失败的原因。

我已经看过很多关于此的帖子,解决方案总是缺少参考文献。这不是这里的情况,我被困住了。使用Chutzpah进行测试时,我错过了什么?

2 个答案:

答案 0 :(得分:1)

我建议使用chutzpah.json settings file进行角度项目。我把它放在我的项目的根目录下,在web.config旁边。您可以通过这种方式在一个位置指定依赖项,这在角度项目快速增长时非常有用。我无法确定,但我认为你的看起来像下面这样:

{
  "Framework": "jasmine",
  "FrameworkVersion": "1",
  "References": [
    { "Path": "./Scripts/angular/angular.js" },
    {        
      "Path": "./Scripts/angular",
      "Includes": [ "*.js" ]
    },
    { "Path": "./Scripts/angular-ui/ui-bootstrap.js" },   
    { "Path": "./app/app.js" },
    {        
      "Path": "./app",
      "Includes": [ "*.js" ]
    }                 
  ],
  "Tests": [
    { "Includes": [ "*.spec.js" ] }
  ]
}

这将在jasmine版本1上运行。我不确定你将如何包含与“./Scripts/angular*.js”匹配的所有内容以及与“./app/*.js”相匹配的所有内容(包括sub -directories)。在添加新的角度引用和应用程序模块时,您不需要修改此配置(一旦使其工作)。

答案 1 :(得分:0)

我相信通过彻底的测试我确定了原因。问题很可能是我在我的测试中使用的ES6 Angular个文件中使用了.js个类。

问题是PhantomJS Chutzpah使用的支持ES6class关键字因此失败(请参阅{{3}用于验证)。我能够在非Angular样本中重现。我使用了一种老式的ES5样式IIFE,现在通过了简单的测试。这就是ChromeReSharper中使用Chrome作为默认测试浏览器并且Chrome支持ES6 class关键字的原因。如果我ReSharper使用PhantomJS而不是Chrome,那么我的简单测试也会失败。

根问题似乎是PhantomJS,并且缺乏对ES6语法的支持。

这是一篇关于我的研究结果的博客文章。它更详细地解释了编写非ES5投诉代码并将其与Chutzpah和PhantomJS一起使用的问题:

this