如何模拟AngularJS指令的控制器

时间:2014-02-20 19:19:59

标签: angularjs

给定一个具有外部控制器的指令:

.directive('d1', function () {
  return {
    controller: 'd1controller',
    restrict: 'E',
    link: function ($scope, $element, $attributes, $controller) {

      $controller.doStuff();

    }
  };
});

如何在d1controller指令的单元测试中模拟d1控制器?


我的尝试:

在模拟服务时我尝试使用$provide

  beforeEach(module('app', function ($provide) {
    ctrlMock = jasmine.createSpyObj('ctrlMock', ['doStuff']);
    $provide.value('d1controller', ctrlMock );
  }));

我也试过$controllerProvider

  beforeEach(module('app', function ($controllerProvider) {
    ctrlMock = jasmine.createSpyObj('ctrlMock', ['doStuff']);
    $controllerProvider.register('d1controller', ctrlMock);
  }));

2 个答案:

答案 0 :(得分:3)

我是OP。事实证明,使用$controllerProvider有效。你必须传递一个构造函数;不是一个实例。

beforeEach(module('app', function ($controllerProvider) {
  $controllerProvider.register('d1controller', function Mock(){
    this.doStuff = function(){};
  });
}));

答案 1 :(得分:1)

我有一个不错的运气创建一个模拟模块,它包含我所有的模拟服务/控制器,然后在我的app模块之后包含那个模拟模块。它将基本上覆盖模拟模块中的所有服务/控制器。

创建你的模拟模块,你的控制器在那个模块中模拟。

appMock = angular.module('appMock', []);

appMock.controller('ControllerToMockCtrl', ['$scope', function($scope) {
    $scope.greeting = 'Hola!';
}]);

在你的测试中。

beforeEach(function(){
  module('app');
  module('appMock');
});

此博客是此策略的一个很好的例子。 http://southdesign.de/blog/mock-angular-js-modules-for-test-di.html#using-the-mock