我该如何监视ngModel?

时间:2015-03-04 14:52:40

标签: javascript angularjs unit-testing

问题

我是单元测试指令没有控制器或模板,只有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();,也会出现这种情况。

1 个答案:

答案 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);