2013-05-26 17 views
60

testen Ich habe einen Controller, der ein Broadcast-Ereignis auf dem Rootscope emittiert. Ich würde gerne testen, dass das Broacast Event korrekt ausgelöst wird.Wie kann ich Broadcast-Ereignis in AngularJS

Mein Code in meinem Controller sieht wie folgt 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 genannt wird, was ich manuell getestet habe, dass es tut. 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, dass eine Veranstaltung gesendet wird?

Antwort

109

Angenommen, Sie verwenden Jasmine, funktioniert das folgende gut für mich.

... 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, um es angebracht, können Sie auch prüfen, dass die Objekte Erwartungen entsprechen

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

es perfekt funktioniert..cheers mate. –

+0

@Mike: Können Sie ein Beispiel für diese Lösung mit Mocha/Chai zeigen? –

+0

@RyanConaway - für Chai sieht es so aus, als würden Sie ein Spion-Plugin wie https://github.com/chaijs/chai-spies benötigen. Für Mocha, besuchen Sie http://sinonjs.org/. Die Dokumentation für beide ist ziemlich klar, wie Sie diese Lösung mit beiden Bibliotheken erreichen würden. –

9

Hier ist, wie sein mit mochaJs gemacht, mit sinon für Mocks 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 
})) 

}) 
Verwandte Themen