如何在指令中测试控制器?

时间:2015-12-28 20:31:05

标签: angularjs unit-testing jasmine

angular.module('myModule', ['somedeps'])
  .directive('myAwesomeDirective', myAwesomeDirectiveFn)


function myAwesomeDirectiveFn() {
  function myAwesomeDirectiveCtrl (someDeps) {
    var vm = this;
    vm.variable_x, vm.variable_y;
    
    vm.action_a = function action_a() {
      console.log("Yaaa, I am action a");
    }
  },
    
  function myAwesomeLinker(scope, element, attribute, controller) {
    //Just print something on console
    element.on('click', function () {
      controller.action_a();
    });
  }
  
  return {
    restrict : 'AE',
    scope : {
      x : '=',
      y : '='
    },
    controller : myAwesomeDirectiveCtrl,
    controllerAs : 'vm',
    link : myAwesomeLinker,
    templateUrl : 'someTemplate.html'
  }
}

现在我想写一个单元测试来测试我的指令和控制器。

我通过以下方式获得指令

directiveElement = angular.element('<my-awesome-directive x = "x" y = "y" />');
var vm = $rootScope.$new();
vm.x = 10;
vm.y = 20;

directiveElement = $compile(directiveElement)(vm);
vm.$digest();

我的理解是我可以通过以下方式获得控制器

controller = directiveElement.controller('myAwesomeDirective');

但是控制器仍未定义。

我做错了什么或完全错了?我想用控制器封装我的指令。我不想在模块上创建任何控制器。

1 个答案:

答案 0 :(得分:1)

只需写下

$compile(directiveElement)(vm);

并且不要将结果分配给directiveElement

另请参阅stackoverflow上this question的答案。