Как я могу протестировать событие Broadcast в AngularJS

У меня есть контроллер, который излучает широковещательное событие на корнеплодах. Я хотел бы проверить, что событие broacast запущено правильно.

Мой код в моем контроллере выглядит следующим образом:

   $scope.$watch("pageIndex", function(){
    if($scope.pageIndex == 4)
    {
      // emit social share
      $rootScope.$broadcast('myEvent');
    }
  });

Я попытался проверить его следующим кодом:

    it('Should call myEvent when pageIndex is 4',function(){
    scope.pageIndex = 4;
    scope.$apply();
    expect(rootScope.$on).toHaveBeenCalledWith('myEvent');
});

Но он говорит мне, что код не вызывается, который я проверил вручную, что он делает. Затем я попытался использовать следующий код:

it('Should call myEvent when pageIndex is 4',function(){
    var listener = jasmine.createSpy('listener');
    rootScope.$on('myEvent', listener);
    scope.pageIndex = 4;
    scope.$apply();
    expect(listener).toHaveBeenCalled();
});

Но с тем же отрицательным результатом. Есть ли способ проверить, что событие транслируется?

Ответ 1

Предполагая, что вы используете Jasmine, следующее работает отлично для меня.

... other unit test setup code ...

var rootScope;
beforeEach(inject(function($injector) {
    rootScope = $injector.get('$rootScope');
    spyOn(rootScope, '$broadcast');
}));

describe("my tests", function() {
    it("should broadcast something", function() {
        expect(rootScope.$broadcast).toHaveBeenCalledWith('myEvent');
    });
});

Если вы передаете сообщение и присоединяете к нему объекты, вы можете даже проверить, соответствуют ли объекты ожиданиям

someObj = { ... something ... };
expect(rootScope.$broadcast).toHaveBeenCalledWith('someEvent', someObj);

Ответ 2

Вот как это делается с моккой, с синоном для насмешек и chai для ожиданий.

describe("broadcast test", function() {
  beforeEach(inject(function($rootScope){
   sinon.spy($rootScope, "$broadcast")
   scope.foo() //this broadcasts the event. $rootScope.$broadcast("testEvent")
 }))

it("broadcasts the event", inject(function($rootScope){
 expect($rootScope.$broadcast.calledWith("testEvent")).to.be.true
}))

})