2013-11-08 1 views
7

У меня есть контроллер и вы хотите протестировать его с помощью Жасмина. В классе контроллера, который я хочу протестировать, есть $ on listener. Как запустить событие $ emit для запуска $ on listener?

myApp.controller('superCtrl', function ($scope) { 
    $scope.hero = 'Rafael ninja turtle'; 

    $scope.$on('change_hero', function (event, new_hero) { 
     $scope.hero = new_hero; 
    }); 
}); 

Тест $ на слушателя работает собственно, когда 'change_hero' событие приходит:

describe('Super controller', function() { 
    var $scope, 
     super_controller; 

    beforeEach(function(){ 

     module('myApp'); 

     inject(function($rootScope, $controller){ 
      $scope = $rootScope.$new(); 

      super_controller = $controller('superCtrl', {$scope: $scope}); 

      spyOn($scope, '$on'); 
     }); 

    }); 

    it('should change change hero on change_hero event', function(){ 

     var new_hero = 'Ralf ninja turtle', 
      sub_scope = $scope.$new(); 

     sub_scope.$emit('change_hero', new_hero); 

     expect($scope.$on).toHaveBeenCalled(); 
     expect($scope.hero).toBe('Ralf ninja turtle'); 
    }); 

}); 
+0

Не работает ли это? Я не понимаю, в чем проблема? –

+1

Если переменная '$ scope.hero' изменилась, то' spyOn' не требуется. – rvignacio

+0

Это просто пример не из реальной жизни. Давайте подумаем, что мне нужно проверить, был ли $ on запущен или нет. – barba

ответ

8

Похоже, вам нужно вызвать spyOn перед созданием контроллера. Кроме того, вам следует позвонить в andCallThrough(), иначе реальный метод не будет вызван, и ваш тест не будет завершен

Смежные вопросы