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

hgc*_*rpd 7 unit-testing jasmine angularjs

如果我有这样的指示

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',
  }
});
Run Code Online (Sandbox Code Playgroud)

我想创建一个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();
Run Code Online (Sandbox Code Playgroud)

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

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

Aus*_*son 7

AngularJS开发人员指南的指令页面:

最佳实践:当您希望将API公开给其他指令时,请使用控制器.否则使用链接.

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