如何在 Angular 1.3.14 中测试需要另一个控制器的 Angular 指令?

How do I test an Angular directive that requires another controller in Angular 1.3.14?

我正在尝试为需要存在父指令的指令编写 Jasmine 测试。我发现了这个问题: Testing directives that require controllers,但是,这有点过时(我相信 Angular 1.1.5),而且 plunkr 似乎不适用于新版本的 Jasmine (2.2.1) 和 Angular (1.3.14)。我得到:

TypeError: undefined is not a function
    at Object.<anonymous>         (http://run.plnkr.co/AHQtPtvSezB4DsnJ/appSpec.js:18:33)

代码如下: var app = angular.module('plunker', []);

app.directive('foo', function() {
  return {
    restrict: 'E',
    controller: function($scope) {
      this.add = function(x, y) {
        return x + y;
      }
    }
  };
});

app.directive('bar', function() {
  return {
    restrict: 'E',
    require: '^foo',
    link: function(scope, element, attrs, foo) {
      scope.callFoo = function(x, y) {
        scope.sum = foo.add(x, y);
      }
    }
  };
});

测试:

describe('Testing directives', function() {
  var $scope, $compile, element;

  beforeEach(function() {
    module('plunker');

    inject(function($rootScope, _$compile_) {
      $scope = $rootScope.$new();
      $compile = _$compile_;
    });
  });

  it('ensures callFoo does whatever it is supposed to', function() {
    // Arrange
    var element = $compile('<foo><bar></bar></foo>')($scope);
    var fooController = element.controller('foo');
    var barScope = element.find('bar').scope();
    spyOn(fooController, 'add').andReturn(3);

    // Act
    barScope.callFoo(1, 2);

    // Assert
    expect(barScope.sum).toBe(3);
    expect(fooController.add).toHaveBeenCalledWith(1, 2);
  });
});

这是工作中的 plunker:

http://plnkr.co/edit/bC5BY81x0hi576xwSdyo?p=preview

我知道这个设计可能不是最好的,但是,我目前有点坚持使用它。谢谢!

上面提到的 SO 问题中的这个答案,方法 #3 效果很好。我显然没有读够。