2013-05-26 8 views
60

Mam kontroler, który emituje zdarzenie broadcast na rootcope. Chciałbym przetestować, czy zdarzenie broacastowe jest uruchamiane poprawnie.Jak mogę przetestować zdarzenie rozgłaszania w AngularJS

Mój kod w moim kontrolera wygląda następująco:

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

starałem się przetestować go z następującego kodu:

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

Ale to mówi mi, że kod nie jest wywoływana, które ręcznie przetestowałem. Próbowałem następnie z następującym kodem:

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

Ale z tym samym wynikiem negatywnym. Czy istnieje sposób na sprawdzenie, czy wydarzenie jest transmitowane?

Odpowiedz

109

Zakładając, że używasz Jasmine, poniższe wskazówki działają dobrze dla mnie.

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

Jeśli nadawanie wiadomości i mocowania przedmiotów do niego, można nawet sprawdzić, że obiekty dopasować oczekiwania

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

to doskonale działało .. szt. Kolczugi. –

+0

@Mike: W jaki sposób możesz pokazać przykład tego rozwiązania z Mocha/Chai? –

+0

@RyanConaway - dla Chai wygląda na to, że potrzebujesz wtyczki szpiegowskiej, takiej jak https://github.com/chaijs/chai-spies. Dla Mocha, sprawdź http://sinonjs.org/. Dokumentacja obu tych metod jasno pokazuje, w jaki sposób można osiągnąć to rozwiązanie w przypadku dowolnej biblioteki. –

9

Oto jak jej zrobić z mochaJs z Sinon dla mocks i chai dla oczekiwania.

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

}) 
Powiązane problemy