AngularJS - 测试指令的链接函数,如何监视控制器

时间:2013-09-12 07:25:52

标签: unit-testing angularjs jasmine

如果我有这样的指示

JS:

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',
  }
});

我想创建一个Jasmine间谍来确保名为controller.someMethod的链接函数,但这不起作用:

规格:

var elem = angular.element('<div my-directive></div>');
var scope = $rootScope.new();
$compile(elem)(scope);

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

间谍创建太晚,因为控制器已实例化,并且在$compile语句中调用了链接函数。

还有哪些方法可以监视链接功能中发生的事情?是否可以预先实例化控制器并将其传递给$compile

1 个答案:

答案 0 :(得分:7)

来自AngularJS Developer Guide's page on Directives

  

最佳实践:如果要将API公开给其他指令,请使用 controller 否则请使用链接

我建议为someMethod()创建服务。然后你可以模拟和监视该服务。否则你可能需要找一些其他迹象表明你想要发生的事实实际发生过。