wake-up-neo.net

jasmine: Async Callback wurde nicht innerhalb des von jasmine.DEFAULT_TIMEOUT_INTERVAL angegebenen Zeitlimits aufgerufen

Ich habe einen Winkeldienst namens requestNotificationChannel:

app.factory("requestNotificationChannel", function($rootScope) {

    var _DELETE_MESSAGE_ = "_DELETE_MESSAGE_";

    function deleteMessage(id, index) {
        $rootScope.$broadcast(_DELETE_MESSAGE_, { id: id, index: index });
    };

    return {
       deleteMessage: deleteMessage
    };

});

Ich versuche diesen Dienst mit Jasmin zu testen:

"use strict";

describe("Request Notification Channel", function() {
    var requestNotificationChannel, rootScope, scope;

    beforeEach(function(_requestNotificationChannel_) {
        module("messageAppModule");

        inject(function($injector, _requestNotificationChannel_) {
            rootScope = $injector.get("$rootScope");
            scope = rootScope.$new();
            requestNotificationChannel = _requestNotificationChannel_;
        })

        spyOn(rootScope, '$broadcast');
    });


    it("should broadcast delete message notification", function(done) {

        requestNotificationChannel.deleteMessage(1, 4);
        expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
        done();       
    });
});

Ich habe über den asynchronen Support in Jasmine gelesen, aber da ich mit Unit-Tests mit Javascript ziemlich neu bin, könnte es nicht funktionieren.

Ich erhalte eine Fehlermeldung: 

Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL

und mein Test dauert zu lange (ca. 5s).

Kann mir jemand helfen, Funktionsbeispiele meines Codes mit einigen Erklärungen zu geben?

107
Mdb

Wenn Sie ein Argument in Ihrer it-Funktion (done im nachstehenden Code) haben, versucht Jasimne, einen asynchronen Aufruf durchzuführen.

//this block signature will trigger async behavior.
it("should work", function(done){
  //...
});

//this block signature will run synchronously
it("should work", function(){
  //...
});

Es macht keinen Unterschied, wie das Argument done benannt wird, seine Existenz ist alles, worauf es ankommt. Ich bin auf diese Ausgabe von zu viel Kopie/Pasta gestoßen.

Jasmin Asynchronous Support docs stellt fest, dass das Argument (oben done genannt) ein Rückruf ist, der aufgerufen werden kann, um Jasmine mitzuteilen, wann eine asynchrone Funktion abgeschlossen ist. Wenn Sie es nie anrufen, wird Jasmine nie wissen, dass Ihr Test abgeschlossen ist, und es kommt zu einem Timeout.

191
mastaBlasta

Um dieses Problem zu umgehen, können Sie das Grenzwertlimit erhöhen, um einen asynchronen Jasmine-Rückruf auszuwerten

describe('Helper', function () {
    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;
    });

    afterEach(function() {
      jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });

    it('Template advance', function(doneFn) {
        $.ajax({
            url: 'public/your-end-point.mock.json',
            dataType: 'json',
            success: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            },
            error: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            }
        });
    });
});

Quelle: http://jasmine.github.io/2.0/introduction.html#section-42

39
gsalgadotoledo

Dieser Fehler kann auch dadurch verursacht werden, dass bei der Initialisierung eines Dienstes/einer Fabrik oder was auch immer Injektion ausgelassen wird. Zum Beispiel kann es durch folgende Aktionen ausgelöst werden:

var service;
beforeEach(function(_TestService_) {
    service = _TestService_;
});

Um dies zu beheben, packen Sie einfach die Funktion mit inject ein, um den Dienst ordnungsgemäß abzurufen:

var service;
beforeEach(inject(function(_TestService_) {
    service = _TestService_;
}));
17
Katana24
import { fakeAsync, ComponentFixture, TestBed } from '@angular/core/testing';

benutze fakeAsync  

beforeEach(fakeAsync (() => {

//your code

}));



describe('Intilalize', () => {
        it('should have a defined component', fakeAsync(() => {
            createComponent();
            expect(_AddComponent.ngOnInit).toBeDefined();
        }));
    });
7
Lijo

Dieser Fehler begann für mich aus heiterem Himmel, bei einem Test, der immer funktioniert hatte. Ich konnte keine Vorschläge finden, die hilfreich waren, bis ich bemerkte, dass mein Macbook schleppend lief. Ich bemerkte, dass die CPU durch einen anderen Prozess blockiert wurde, den ich getötet hatte. Der Jasmin-Async-Fehler ist verschwunden und meine Tests sind wieder in Ordnung.

Frag mich nicht warum, ich weiß es nicht. In meiner Situation schien es jedoch ein Mangel an fehlerhaften Systemressourcen zu sein.

4
Eric Soyke

Sie können karma-jasmine plugin verwenden, um das Standard-Timeout-Intervall global festzulegen.

Fügen Sie diese Konfiguration in karma.conf.js hinzu

module.exports = function(config) {
  config.set({
    client: {
      jasmine: {
        timeoutInterval: 10000
      }
    }
  })
}
2
code.rookie

Sie erhalten diese Fehlermeldung auch, wenn Sie etwas in der Funktion beforeAll erwarten! 

describe('...', function () {

    beforeAll(function () {
        ...

        expect(element(by.css('[id="title"]')).isDisplayed()).toBe(true);
    });

    it('should successfully ...', function () {

    }
}
2
Tom Van Rossom

Funktioniert nach dem Entfernen der scope-Referenz und der Funktionsargumente:

"use strict";

describe("Request Notification Channel", function() {
    var requestNotificationChannel, rootScope;

    beforeEach(function() {
        module("messageAppModule");

        inject(function($injector, _requestNotificationChannel_) {
            rootScope = $injector.get("$rootScope");
            requestNotificationChannel = _requestNotificationChannel_;
        })
        spyOn(rootScope, "$broadcast");
    });


    it("should broadcast delete message notification with provided params", function() {
        requestNotificationChannel.deleteMessage(1, 4);
        expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4} );
    });
});
1
Paul Sweatte

Wenn Sie ein Argument (done) in der it-Funktion haben, versuchen Sie es ebenfalls zu entfernen.

it("should broadcast delete message notification", function(/*done -> YOU SHOULD REMOVE IT */) {

    requestNotificationChannel.deleteMessage(1, 4);
    expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
    // done(); -> YOU SHOULD REMOVE IT        
});
0
tiagor87

Wie von @mastablasta angemerkt, aber auch hinzugefügt, wenn Sie das 'done' -Argument aufrufen oder es complete - nennen rufen Sie einfach den Callback complete () in Ihrem Test auf, wenn es fertig ist.

// this block signature will trigger async behavior.
it("should work", function(done){
  // do stuff and then call done...
  done();
});

// this block signature will run synchronously
it("should work", function(){
  //...
});
0
SoEzPz

jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;

Wenn ich das im Block halte, wurde mein Problem gelöst.

it('', () => {
 jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;
});
0
Sai Prasad

In meinem Fall wurde dieser Fehler durch die unsachgemäße Verwendung von "fixture.detectChanges ()" verursacht. Es scheint, dass diese Methode ein Ereignis-Listener (async) ist, der nur dann einen Rückruf antwortet, wenn Änderungen erkannt werden. Wenn keine Änderungen erkannt werden, wird der Callback nicht aufgerufen, was zu einem Zeitüberschreitungsfehler führt. Hoffe das hilft :)

0
A. Figueroa

Was ich getan habe war: Den folgenden Code hinzugefügt/aktualisiert:

framework: 'jasmine',
jasmineNodeOpts: 
{
    // Jasmine default timeout
    defaultTimeoutInterval: 60000,
    expectationResultHandler(passed, assertion) 
    {
      // do something
    },
}
0
Zeeshan

Dies ist mehr eine Beobachtung als eine Antwort, aber es kann anderen helfen, die genauso frustriert waren wie ich. 

Ich habe diesen Fehler immer wieder von zwei Tests in meiner Suite erhalten. Ich dachte, ich hätte die Tests mit dem Refactoring, das ich gerade durchführte, einfach gebrochen. Nachdem das Zurücksetzen der Änderungen nicht funktioniert hatte, kehrte ich zu früherem Code zurück, zweimal (zwei Überarbeitungen zurück), und dachte, der Fehler würde damit behoben. Daran hat sich nichts geändert. Ich habe gestern den ganzen Tag den Schwanz gejagt, und einen Teil des Morgens, ohne das Problem zu lösen.

Ich wurde frustriert und checkte heute morgen den Code auf einem Laptop aus. Lief die gesamte Testsuite (ca. 180 Tests), keine Fehler. Die Fehler waren also niemals im Code oder in Tests. Ging zu meiner Dev-Box zurück und startete sie neu, um alle Inhalte im Speicher zu löschen, die das Problem verursacht haben könnten. Keine Änderung, gleiche Fehler bei den gleichen beiden Tests. Also löschte ich das Verzeichnis von meinem Rechner und checkte es wieder aus. Voila! Keine Fehler.

Keine Ahnung, was es verursacht hat oder wie man es reparieren kann, aber wenn Sie das Arbeitsverzeichnis löschen und es wieder auschecken, wurde das Problem behoben. 

Hoffe das hilft jemandem.

0
delliottg