it-swarm.com.de

Wie kann ich Broadcast-Ereignisse in AngularJS testen?

Ich habe einen Controller, der ein Broadcast-Ereignis auf dem Rootscope ausgibt. Ich möchte testen, ob das Broacast-Ereignis korrekt ausgelöst wurde.

Mein Code in meinem Controller sieht folgendermaßen aus:

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

Ich habe versucht, es mit dem folgenden Code zu testen:

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

Aber es sagt mir, dass der Code nicht aufgerufen wird, was ich manuell getestet habe. Ich habe es dann mit folgendem Code versucht:

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();
});

Aber mit dem gleichen negativen Ergebnis. Gibt es eine Möglichkeit zu testen, ob eine Veranstaltung gesendet wird?

63
Dofs

Angenommen, Sie verwenden Jasmine, dann funktioniert das Folgende für mich hervorragend.

... 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');
    });
});

Wenn Sie eine Nachricht senden und Objekte daran anhängen, können Sie sogar testen, ob die Objekte den Erwartungen entsprechen

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

Hier ist, wie es mit Mokkas gemacht wird, mit Sinon für Verspottungen und Chai für Erwartungen.

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
}))

})
11
Sudhir N