我很好奇我将如何进行单元测试我认为是指令中的匿名控制器。
directive.js
app.directive('directive',
function() {
var controller = ['$scope', function($scope) {
$scope.add = function() { ... };
}];
return {
restrict: 'A',
scope: {
args: '='
},
templateUrl: '...',
controller: controller
};
}
};
控制器定义为能够进行单元测试吗?我试图用几种不同的方式初始化它。目前我的设置如下:
describe('The directive', function() {
var element,
scope,
controller;
var args = {
...
}
beforeEach(module('app'));
beforeEach(module('path/to/template.html'));
beforeEach(function() {
inject(function($compile, $rootScope, $controller) {
scope = $rootScope.$new();
scope.args = args;
element = angular.element('<div directive></div>');
template = $compile(element)(scope);
scope.$digest();
controller = element.$controller;
});
});
// assertions go here
});
我一直收到TypeError: 'undefined' is not an object (evaluating ...)
错误,因此我认为我没有正确初始化控制器。我主要想知道这样的东西是否可以单元测试,而根本不需要改变指令的源代码。
答案 0 :(得分:2)
我不确定你是否有可能做的事情。但是,我知道有一种更简单的方法,那就是使它成为标准控制器。 (你似乎已经意识到这一点,但值得指出。)
控制器中的逻辑实际上不应该依赖于指令,因此通过创建一个命名控制器,您可以分离关注点,这是一件好事。 You can even see this used in recommended style guides for AngularJS.一旦您正确设置了控制器,您就不会有任何问题进行测试。像这样拆分它也有助于进行适当的依赖注入,从而实现更简单的代码和更简单的测试。