wake-up-neo.com

Wie kann ich Ereignisse in eckig testen?

Ich muss testen, ob Ereignisse korrekt gesendet oder gesendet werden und Ereignisse manuell auslösen.

Was ist der beste Weg dies zu tun?

65
Kenneth Lynne

Wenn Sie nur ein paar Tests zum Abfeuern und Fangen von Ereignissen benötigen, mache ich das so. Um sicherzustellen, dass ein bestimmtes Ereignis ausgelöst wird ($emited oder $broadcasted), ist ein Spion der richtige Weg. Sie benötigen einen Verweis auf den Bereich, in dem $emit oder $broadcast aufgerufen wird, und führen Sie einfach folgende Schritte aus:

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

Wenn Sie sich nicht um die Argumente kümmern müssen, die mit $emit übergeben werden, können Sie $on in den $rootScope setzen und ein Flag setzen, um zu wissen, dass das Ereignis ausgelöst wurde. Etwas wie das:

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

Für das Testen von Funktionen, die ausgeführt werden, wenn ein Ereignis abgefangen wird ($on), ist dies etwas einfacher. 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 vor, dass diese Ereignisbehandlung in einer Direktive oder einem Controller (oder in beiden) stattfinden würde. Zum Einrichten von Direktive-Tests siehe https://github.com/vojtajina/ng-directive-testing . Informationen zum Einrichten von Controller-Tests finden Sie unter https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27

Hoffe das hilft.

121
dnc253

Wir haben diese Syntax für A1 verwendet

=========== 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
0
Jnewbie

Hier sind die Schritte, die Sie zum $ Broadcast-Ereignis in angle JS beachten sollten

Initialisieren Sie den rootScope- und scope-Stub während der Installation wie folgt:

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

Nachdem der Controller erstellt wurde, wird das Ereignis mit rootScope wie folgt ausgelöst:

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