Javascript 我怎样才能监视ngModel?

Javascript 我怎样才能监视ngModel?,javascript,angularjs,unit-testing,Javascript,Angularjs,Unit Testing,问题 我正在单元测试一个指令没有控制器或模板,只有一个链接函数。该指令需要ngModel,并在link函数中调用其函数之一。我想在单元测试中监视ngModel,以确保调用了正确的函数 代码 指令: angular.module('some-module').directive('someDirective', function() { return { restrict: 'A', require: 'ngModel', link: function(scope, e

问题

我正在单元测试一个指令没有控制器或模板,只有一个
链接
函数。该指令需要
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() {};
  });
}));
var ngModelControllerSpyDoSomething = sinon.spy(element.controller('ngModel'), 'doSomething');
正如我在上所发现的,尝试重写内置属性会导致抛出错误,这是一种糟糕的做法

然后我试着按照指令的方式来测试指令:


但这不起作用,因为运行了一个
$compile
,它会执行
链接
函数,所以我不会监视它,直到它太迟了(间谍会回来,因为从来没有被调用过)。如果我放置
$scope.$digest(),也会出现这种情况
在创建spy之前或之后。

您必须将spy添加到注入到
$compile
-函数的
$scope
中,然后将其链接到实际指令
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);
var$scope=$rootScope.$new();
$scope.mySpy=//在此处使用sinon创建存根函数
var元素=$compile(“”)($scope);

我如何检查是否调用了
ngModel
的属性?调用的函数是
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);