如何在 Angular 1.3.14 中测试需要另一个控制器的 Angular 指令?
How do I test an Angular directive that requires another controller in Angular 1.3.14?
我正在尝试为需要存在父指令的指令编写 Jasmine 测试。我发现了这个问题:
Testing directives that require controllers,但是,这有点过时(我相信 Angular 1.1.5),而且 plunkr 似乎不适用于新版本的 Jasmine (2.2.1) 和 Angular (1.3.14)。我得到:
TypeError: undefined is not a function
at Object.<anonymous> (http://run.plnkr.co/AHQtPtvSezB4DsnJ/appSpec.js:18:33)
代码如下:
var app = angular.module('plunker', []);
app.directive('foo', function() {
return {
restrict: 'E',
controller: function($scope) {
this.add = function(x, y) {
return x + y;
}
}
};
});
app.directive('bar', function() {
return {
restrict: 'E',
require: '^foo',
link: function(scope, element, attrs, foo) {
scope.callFoo = function(x, y) {
scope.sum = foo.add(x, y);
}
}
};
});
测试:
describe('Testing directives', function() {
var $scope, $compile, element;
beforeEach(function() {
module('plunker');
inject(function($rootScope, _$compile_) {
$scope = $rootScope.$new();
$compile = _$compile_;
});
});
it('ensures callFoo does whatever it is supposed to', function() {
// Arrange
var element = $compile('<foo><bar></bar></foo>')($scope);
var fooController = element.controller('foo');
var barScope = element.find('bar').scope();
spyOn(fooController, 'add').andReturn(3);
// Act
barScope.callFoo(1, 2);
// Assert
expect(barScope.sum).toBe(3);
expect(fooController.add).toHaveBeenCalledWith(1, 2);
});
});
这是工作中的 plunker:
http://plnkr.co/edit/bC5BY81x0hi576xwSdyo?p=preview
我知道这个设计可能不是最好的,但是,我目前有点坚持使用它。谢谢!
上面提到的 SO 问题中的这个答案,方法 #3 效果很好。我显然没有读够。
我正在尝试为需要存在父指令的指令编写 Jasmine 测试。我发现了这个问题: Testing directives that require controllers,但是,这有点过时(我相信 Angular 1.1.5),而且 plunkr 似乎不适用于新版本的 Jasmine (2.2.1) 和 Angular (1.3.14)。我得到:
TypeError: undefined is not a function
at Object.<anonymous> (http://run.plnkr.co/AHQtPtvSezB4DsnJ/appSpec.js:18:33)
代码如下: var app = angular.module('plunker', []);
app.directive('foo', function() {
return {
restrict: 'E',
controller: function($scope) {
this.add = function(x, y) {
return x + y;
}
}
};
});
app.directive('bar', function() {
return {
restrict: 'E',
require: '^foo',
link: function(scope, element, attrs, foo) {
scope.callFoo = function(x, y) {
scope.sum = foo.add(x, y);
}
}
};
});
测试:
describe('Testing directives', function() {
var $scope, $compile, element;
beforeEach(function() {
module('plunker');
inject(function($rootScope, _$compile_) {
$scope = $rootScope.$new();
$compile = _$compile_;
});
});
it('ensures callFoo does whatever it is supposed to', function() {
// Arrange
var element = $compile('<foo><bar></bar></foo>')($scope);
var fooController = element.controller('foo');
var barScope = element.find('bar').scope();
spyOn(fooController, 'add').andReturn(3);
// Act
barScope.callFoo(1, 2);
// Assert
expect(barScope.sum).toBe(3);
expect(fooController.add).toHaveBeenCalledWith(1, 2);
});
});
这是工作中的 plunker:
http://plnkr.co/edit/bC5BY81x0hi576xwSdyo?p=preview
我知道这个设计可能不是最好的,但是,我目前有点坚持使用它。谢谢!
上面提到的 SO 问题中的这个答案,方法 #3 效果很好。我显然没有读够。