Javascript 如何使用Jasmine测试具有依赖注入的角度控制器?
我正在尝试测试我的一个角度控制器。首先,我想看看,我可以调用控制器中的一个简单函数,它返回两个数字的和 这是控制器的相关部分,带有简单求和函数(为了简单起见,我省略了所有其他函数): 除了$rootscope和$scope之外,控制器还接受多个服务 现在我想从Jasmine调用这个求和函数,并为此制作了这个jsJavascript 如何使用Jasmine测试具有依赖注入的角度控制器?,javascript,angularjs,jasmine,chutzpah,Javascript,Angularjs,Jasmine,Chutzpah,我正在尝试测试我的一个角度控制器。首先,我想看看,我可以调用控制器中的一个简单函数,它返回两个数字的和 这是控制器的相关部分,带有简单求和函数(为了简单起见,我省略了所有其他函数): 除了$rootscope和$scope之外,控制器还接受多个服务 现在我想从Jasmine调用这个求和函数,并为此制作了这个js /// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homew
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/jasmine/jasmine.js" />
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/angular.min.js" />
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/angular-mocks.js" />
/// <reference path="app.js" />
/// <reference path="detailController.js" />
'use strict';
describe('detailModule', function () {
beforeEach(module('detailModule'));
describe('detailController', function () {
var scope, controller, rootScope;
var detailService, sharedPropertiesService, facebookService, helperService, uiStateService;
beforeEach(inject(function (_$rootScope, _$scope, _detailService, _sharedPropertiesService, _facebookService, _helperService, _uiStateService, $controller) {
rootScope = _$rootScope;
scope = $rootScope.$new();
detailService = _detailService;
sharedPropertiesService = _sharedPropertiesService;
facebookService = _facebookService;
helperService = _helperService;
uiStateService = _uiStateService;
controller = $controller('detailController', {
$rootScope : rootScope,
$scope: scope,
detailService: detailService,
sharedPropertiesService: sharedPropertiesService,
facebookService: facebookService,
helperService: helperService,
uiStateService: uiStateService
});
}));
it('should return 10', function () {
var result = scope.sum(3, 7);
expect(result).toEqual(10);
});
})
})
我不知道我在这里错过了什么
更新: 我试图按照estus的建议简化控制器: 现在看起来是这样的:
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/jasmine/jasmine.js" />
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/angular.min.js" />
/// <reference path="D:\Users\bbrinch\Documents\Visual Studio 2015\Projects\Homework\Homework\Scripts/angular-mocks.js" />
/// <reference path="app.js" />
/// <reference path="detailController.js" />
'use strict';
describe('detailModule', function () {
beforeEach(module('detailModule'));
describe('detailController', function () {
var scope, controller;
beforeEach(inject(function (_$rootScope) {
scope = _$rootScope.$new();
controller = $controller('detailController', {
$scope: scope,
});
}));
it('should return 10', function () {
var result = scope.sum(3, 7);
expect(result).toEqual(10);
});
})
})
//
///
///
///
///
"严格使用",;
描述('detailModule',函数(){
在每个(模块(“详细模块”)之前;
描述('detailController',函数(){
var范围、控制器;
beforeach(注入(函数)($rootScope){
scope=$rootScope.$new();
控制器=$controller('detailController'{
$scope:scope,
});
}));
它('应该返回10',函数(){
var结果=范围总和(3,7);
期望(结果)。toEqual(10);
});
})
})
但是,我仍然会遇到以下错误:
无法实例化模块detailModule,原因是:
[$injector:modulerr]$injector/modulerr?p0=h
更新2
我解决了。问题是我丢失了参考资料。基本上,所有以某种方式涉及的模块、服务、控制器等都必须被引用
如果它能够自动遍历并解析所有需要的引用,那就太好了。可以遵循,消息如下:
“家庭作业模块”模块不可用!您要么拼错了模块名,要么忘记加载它。如果注册模块,请确保将依赖项指定为第二个参数
$controller
与当前规范共享喷油器,没有理由为$controller
指定依赖项,除非它们是本地的或模拟的。应该是:
controller = $controller('detailController', {
$scope: scope
});
TypeError:undefined不是对象(正在计算“scope.sum”)
这意味着范围未定义
这很可能是因为这个代码
rootScope = _$rootScope;
scope = $rootScope.$new(); // it should be either _$rootScope.new() or rootScope.new()
只需更改此项即可进行检查。这不会更改任何内容。我试图简化测试代码。请参阅更新的问题。@brinch
$injector:modulerr
错误与模块问题有关。出现此错误是因为未加载homeworkModule
。因此必须引用层次结构中的所有依赖项(模块、控制器、指令、服务等)?看起来detailModule
取决于homeworkModule
。并且包含家庭作业模块
模块的文件应按规范加载。
controller = $controller('detailController', {
$scope: scope
});
rootScope = _$rootScope;
scope = $rootScope.$new(); // it should be either _$rootScope.new() or rootScope.new()