Ich muss testen, dass Ereignisse korrekt emittiert oder gesendet werden, und Ereignisse manuell auslösen.Wie kann ich Ereignisse in eckigen testen?
Was ist der beste Weg, dies zu tun?
Ich muss testen, dass Ereignisse korrekt emittiert oder gesendet werden, und Ereignisse manuell auslösen.Wie kann ich Ereignisse in eckigen testen?
Was ist der beste Weg, dies zu tun?
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.
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);
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
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? –
@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. –
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