我有一个非常简单的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进行测试时,我错过了什么?
答案 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
使用的不支持ES6
和class
关键字因此失败(请参阅{{3}用于验证)。我能够在非Angular
样本中重现。我使用了一种老式的ES5
样式IIFE
,现在通过了简单的测试。这就是Chrome
和ReSharper
中使用Chrome
作为默认测试浏览器并且Chrome支持ES6
class
关键字的原因。如果我ReSharper
使用PhantomJS
而不是Chrome
,那么我的简单测试也会失败。
根问题似乎是PhantomJS
,并且缺乏对ES6
语法的支持。
这是一篇关于我的研究结果的博客文章。它更详细地解释了编写非ES5投诉代码并将其与Chutzpah和PhantomJS一起使用的问题: