这个问题让我很生气。
测试代码:
describe('controller', function(){
module('controllers');
var createCtrl;
beforeEach(inject(function($injector){
$rootScope = $injector.get('$rootScope');
var $controller = $injector.get('$controller');
createCtrl = function(){
return $controller('controller', {
$scope: $rootScope
});
}));
it('should create a controller', function(){
var ctrl = createCtrl();
});
});
如果i控制器功能在全局范围内定义,则可行。例如
angular.module('controllers', [])
.controller('controller', ['$scope', controller]);
function controller($scope){}
但是如果我将函数本身移动到数组中,或者将模块代码包装在闭包中(在这些中的任意组合中):
(function(angular){
angular.module('controllers', [])
.controller('controller', ['$scope', function($scope){}]);
})(angular);
测试开始抛出此错误
Error: [ng:areq] Argument 'controller' is not a function, got undefined
有什么想法吗?我真的需要这个控制器不要污染全球范围。
答案 0 :(得分:2)
首先,您需要修复语法问题。分配给createCtrl
的函数缺少一个结束的大括号。
要解决您的实际问题,您需要包含角度模拟并替换
module('controllers');
与
beforeEach(angular.mock.module('controllers'));
将函数本身移动到数组中似乎完全有效,我个人一直使用这种语法。将它们包装在闭包中似乎是不必要的,因为你没有暴露任何变量。
我还建议不要将$ rootScope用作当前的$ scope。而是使用$rootScope.$new()
。