Unit testing AngularJS-测试指令';s链接功能,如何监视控制器

Unit testing AngularJS-测试指令';s链接功能,如何监视控制器,unit-testing,angularjs,jasmine,Unit Testing,Angularjs,Jasmine,如果我有这样的指令 JS: 我想创建一个Jasmine spy,以确保名为controller.someMethod的链接函数不起作用: 规格: var elem=angular.element(“”); var scope=$rootScope.new(); $compile(elem)(范围); var ctrl=elem.controller('myDirective'); spyOn(ctrl,'someFunc')。和callthrough(); spy创建得太晚,因为在$compi

如果我有这样的指令

JS:

我想创建一个Jasmine spy,以确保名为
controller.someMethod
的链接函数不起作用:

规格:

var elem=angular.element(“”);
var scope=$rootScope.new();
$compile(elem)(范围);
var ctrl=elem.controller('myDirective');
spyOn(ctrl,'someFunc')。和callthrough();
spy创建得太晚,因为在
$compile
语句中实例化了控制器并调用了link函数

还有什么其他方法可以监视link函数中发生的事情?是否可以先实例化控制器,然后将其传递到
$compile

中:

最佳实践:当您想向其他指令公开API时,请使用控制器否则使用链接


我建议为
someMethod()
所做的任何事情创建一个服务。然后你可以嘲笑和监视这项服务。否则,您可能需要寻找其他迹象,表明您希望发生的事情实际上已经发生。

建议测试结果状态,但我尝试测试的状态不是DOM状态。控制器保存方法调用的结果并将其放入数组中以跟踪引用,但引用无法识别,因此我只能计算数组的长度,这似乎不太理想。我认为这可能是正确的。从提出这个问题开始,我了解到控制器、指令和服务之间的程序结构对于可测试性非常重要。
app.controller('MyController', function($scope) {
  this.someMethod = function() {
  };
});

app.directive('myDirective', function() {
  return {
    scope: true
    link: function(scope, elem, attrs, controller) {
      controller.someMethod();
    }
    controller: 'MyController',
  }
});
var elem = angular.element('<div my-directive></div>');
var scope = $rootScope.new();
$compile(elem)(scope);

var ctrl = elem.controller('myDirective');
spyOn(ctrl, 'someFunc').andCallThrough();