angularjs - How to unit test Angular controller with $scope.$on? -


i have controller event listener in angular app, defined follows.

  angular.module('test').controller('testctrl', function($rootscope, $scope, testservice) {      [...]      $scope.$on("myevent", function(args, value) {       testservice.dostuff(value);     });   }); 

this works in app itself. however, when try unit test functionality of controller (using jasmine , karma), each test method throws following error:

 typeerror: $scope.$on not function in [...]/testcontroller.js 

i create controller in test methods follows.

  it('does stuff', inject(function($rootscope, $controller, testservice) {     var scope = $rootscope.$new;     $controller('testctrl', {       $scope : scope     });      [...]   })); 

i can around problem changing controller use rootscope instead:

  $rootscope.$on(...) 

but of course app doesn't work anymore expected. can rid of error introducing $on method in test code:

  var scope = $rootscope.$new;   scope.$on = function() {}; 

but mocking listener kind of defeats purpose of testing real code.

why doesn't test code find the $on method of the scope? (but finds on rootscope, still...)

there must fundamental i'm missing here haven't been able figure out after lots of googling , reading angular source code.

$rootscope.$new function. need invoke ($rootscope.$new()):

it('does stuff', inject(function($rootscope, $controller, testservice) {   var scope = $rootscope.$new();   $controller('testctrl', {     $scope : scope   });    [...] })); 

example plunk: http://plnkr.co/edit/t1x62msmoqdknitgzcp9?p=preview


Comments

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -