问题
我是单元测试指令没有控制器或模板,只有link
函数。该指令需要ngModel
并在link
函数中调用其中一个函数。我想在我的单元测试中监视ngModel
,以确保调用正确的函数。
代码
指令:
angular.module('some-module').directive('someDirective', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, controller) {
controller.doSomething(); //Calls some random function on the ngModel controller
}
};
});
我尝试了什么
我试图像这样注射间谍ngModel
:
beforeEach(module(function($provide) {
$provide.factory('ngModelDirective', function() {
return {};
});
$provide.factory('ngModelController', function() {
return function() {};
});
}));
正如我在this question上发现的那样,尝试覆盖内置属性会导致抛出错误,这是不好的做法。
然后我尝试按照Angular docs对...的方式测试指令:
var $scope = $rootScope.$new();
var element = $compile('<div some-directive></div>')($scope);
像这样窥探NgModelController
:
var ngModelControllerSpyDoSomething = sinon.spy(element.controller('ngModel'), 'doSomething');
但是这不起作用,因为运行了一个$compile
,它执行link
函数,所以我不会监视它,直到它为时已晚(间谍再次回来)被称为)。如果我在创建间谍之前或之后放置$scope.$digest();
,也会出现这种情况。
答案 0 :(得分:-1)
您必须将间谍添加到注入$scope
- 函数的$compile
中,然后将其链接到实际指令s HTML
ngModel`中,以便:
var $scope = $rootScope.$new();
$scope.mySpy = // create a stub function with sinon here
var element = $compile('<div some-directive ng-model="mySpy"></div>')($scope);