I am attempting to trigger the $scope.$on()
method in a controller that is fired when I $rootScope.broadcast()
an event. I found this question useful: How can I test events in angular?, but I'm still having trouble detecting an event being broadcast from the $rootScope
up through a controller's $scope
.
So far I've managed to test that the $broadcast
method is called on a corresponding $rootScope
, but not that the $on
method was called on a corresponding $scope
when $broadcast
is called on the $rootScope
.
I attempted to $rootScope.$broadcast
directly in my test, but my spy is not picking up on the event.
This is my controller:
angular.module('app.admin.controllers.notes', [])
.controller('NotesCtrl', function($scope) {
$scope.$on('resource-loaded', function(event, resource) { // I want to test this
$scope.parentType = resource.type;
$scope.parentId = resource.id;
});
});
This is my test:
describe('The notes controller', function() {
beforeEach(module('app.admin.controllers.notes'));
var scope, rootScope, NotesCtrl;
beforeEach(inject(function($controller, $injector, $rootScope) {
rootScope = $rootScope;
scope = $rootScope.$new(); // I've tried this with and without $new()
NotesCtrl = $controller('NotesCtrl', {$scope: scope}); // I've tried explicitly defining $rootScope here
}));
it('should respond to the `resource-loaded` event', function() {
spyOn(scope, '$on');
rootScope.$broadcast('resource-loaded'); // This is what I expect to trigger the `$on` method
expect(scope.$on).toHaveBeenCalled();
});
});
And here's the plunkr. I've included a passing test of the $broadcast
method for reference, mainly because I setup the tests in the same manner.
I've read quite a few questions relating to testing events in AngularJS, and it always seems to be a scoping issue. I've heard that in Karma unit testing, $rootScope
and $scope
are the same thing, but I'm not really sure what the implication is. I've tried defining the $rootScope
and the $scope
as the same object, as well as explicitly injecting the $rootScope
into the NotesCtrl
during testing, but nothing makes my test go green.
How can I get the $on
method in my NotesCtrl
to fire for this test?