Antwort

119

Wenn Sie nur ein paar Tests für das Auslösen und Fangen von Ereignissen benötigen, dann mache ich das so. Um sicherzustellen, dass ein bestimmtes Ereignis ausgelöst wird ($emit -ed oder $broadcast -ed), ist ein Spion der richtige Weg. Sie müssen einen Verweis auf den Bereich, der gerade wird Aufruf zu tun, so etwas wie dies die $emit oder $broadcast, und dann:

spyOn(scope, "$emit") 
//run code to test 
expect(scope.$emit).toHaveBeenCalledWith("MY_EVENT_ID", other, possible, args); 

Wenn Sie nicht brauchen oder wollen nicht über die Argumente kümmern, die übergeben mit der $emit, können Sie eine $on auf die $rootScope setzen und setzen Sie eine Flagge zu wissen, dass das Ereignis emittiert wurde. Etwas wie folgt aus:

var eventEmitted = false; 
$rootScope.$on("MY_EVENT_ID", function() { 
    eventEmitted = true; 
}); 
//run code to test 
expect(eventEmitted).toBe(true); 

Für Testfunktionen, die ausgeführt wird, wenn ein Ereignis abgefangen wird ($on), dann ist es ein wenig leichter. Holen Sie sich einfach einen $rootScope von der inject Funktion und senden Sie dann das gewünschte Ereignis.

$rootScope.$broadcast("EVENT_TO_TEST", other, possible, args); 
//expects for event here 

Nun stelle ich mir diese Ereignisbehandlung würde in einer Richtlinie oder einer Steuerung geschehen (oder beides) für die Richtlinie Tests finden Sie unter Einrichten https://github.com/vojtajina/ng-directive-testing. Weitere Informationen zum Einrichten von Controller-Tests finden Sie unter https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27

Ich hoffe, dies hilft.

+0

Das ist gut für genaue Übereinstimmungen, aber wie würde man eine Teilmenge von Argumenten zusammenbringen? Zum Beispiel, wenn die Argumente nur ein Objekt sind {p1: 'ja', p2: 'nein'} wie würdest du erwarten, dass p1: 'ja' egal was p2 ist (oder ob es ein Ereignis gibt)? Ich weiß, dass es die "Any" Jasmin-Tastatur gibt, aber das scheint das Gegenteil zu sein - nicht feinkörnig genug Kontrolle. Irgendein Mittelweg, wo Sie nur die Argumente erwarten können, die Sie wollen? –

+0

@LukeMadera Jasmin hat 'Jasmine.ObjectContaining'. Aus der Dokumentation: jasmine.objectContaining ist für die Zeiten, in denen eine Erwartung nur bestimmte Schlüssel/Wert-Paare im eigentlichen Objekt interessiert. –

+0

Danke, aber würde es einen Weg geben, Jasmin zu verwenden? Etwas wie: 'expect (scope. $ Emit.calls.argsFor (0) [0]). ToBe ('MY_EVENT_ID');' – cameronroe

0

Hier sind die Schritte, die Sie zu $ ​​broadcast-Ereignis in Winkel JS folgen sollte

Während die rootScope und Umfang Stub inijecting initialisieren, wie unten angegeben:

var rootScope; 
var scopeStub = beforeEach(function() { 
    inject(function($rootScope, _$controller_) { 
     rootScope = $rootScope; 
     scopeStub = $rootScope.$new(); 
     $controller = _$controller_; 
    }); 
}); 

Nach Controller Raise Ereignis erstellt wird rootScope wie unten:

rootScope.$broadcast('eventName', parameter1); 
0

verwendet Wir haben dieses sintax für A1

=========== Controller ======== 
    var vm = this; 
    $scope.$on('myEvent', function(event, data){ 
     console.log('event number', data.id); 
    }); 
============ Test ============= 
it('should throw myEvent', function() { 
    var data = {}; 
    $scope.$broadcast('myEvent', {id:1}); 
    $scope.$broadcast('myEvent', {id:2}); 
    $scope.$broadcast('myEvent', {id:3}); 
}); 

============ Output ============ 
Chrome LOG: '--------------------------------------------' 
Chrome LOG: 'event number', 1 
Chrome LOG: 'event number', 2 
Chrome LOG: 'event number', 3 
Verwandte Themen