Wie ändere ich das Zeitlimit für eine asynchrone Jasminknotenspezifikation?


88

Wie kann ich diesen Test bestehen, ohne auf Läufe / Wartezeiten für Blöcke zurückzugreifen?

it("cannot change timeout", function(done) {

     request("http://localhost:3000/hello", function(error, response, body){

         expect(body).toEqual("hello world");

         done();
     });
});

Antworten:


103

Sie können es (jetzt) ​​direkt in der Spezifikation gemäß den Jasmine-Dokumenten einstellen .

describe("long asynchronous specs", function() {

    var originalTimeout;

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

    it("takes a long time", function(done) {
        setTimeout(function() {
            done();
        }, 9000);
    });

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

Ja, die jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;Wertänderung hat mir bei einem brandneuen Setup geholfen, das mit Jasmine + Jest von Grund auf neu erstellt wurde. Es funktioniert wie erwartet.
Ignacio Segura

Ich stimme @willydee zu, hatte Probleme mit laufenden Tests mit Cloudinary und dieser kleine Ausschnitt kam zu meiner Rettung.
Dev Yego


43

Gehen Sie folgendermaßen vor, um das globale Jasmin-Knoten-Zeitlimit festzulegen:

jasmine.getEnv().defaultTimeoutInterval = timeoutYouWouldPrefer;// e.g. 15000 milliseconds

Dank an Entwickler Gabe Hicks für das Herausfinden des .getEnv () - Teils durch Debuggen trotz Fehlinformationen im README-Dokument, das behauptet, dies sei durch Setzen von jasmine.DEFAULT_TIMEOUT_INTERVAL geschehen.

Wenn Sie ein benutzerdefiniertes Zeitlimit nur für ein it () festlegen möchten, können Sie versuchen, das Zeitlimit (Millisekunden) als drittes Argument (nach der Zeichenfolgenanweisung und der Funktion) zu übergeben. Es ist ein Beispiel dafür , dass getan wird hier , aber ich bin sicher nicht das, was , wenn das benutzerdefinierte Timeout passieren würde , ist länger als Jasmins Standard. Ich gehe davon aus, dass es scheitern würde.


28
Update für alle, die 2014 über diese Antwort stolpern: Für Jasmine 2 funktioniert die Einstellung jasmine.DEFAULT_TIMEOUT_INTERVAL.
Simon Groenewolt

2
Es funktioniert für mich bei einem brandneuen Setup mit Jest + Jasmine. Ich habe gerade jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000;eine globale Konfigurationsdatei hinzugefügt, die ich für alle Tests verwende, und sie funktioniert wie erwartet.
Ignacio Segura

21

Sieht so aus, als könnten Sie es jetzt als letztes Argument für die itFunktion hinzufügen :

describe('my test', function(){
    it('works', function(done){
        somethingAsync().then(done);
    }, 10000); // changes to 10 seconds
});

11

Platzieren Sie dies in Angular außerhalb Ihres Beschreibungsblocks:

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

Dies gilt für alle Tests in der Datei .spec.ts


3

Setzen Sie es nach describeAussage:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

1

Warum nicht durch Ausspionieren setTimeout()?

Etwas wie:

var spy = spyOn(window, 'setTimeout').andCallFake(function (func, timeout) {
    expect(timeout).toEqual(2500);
    func();
});

setTimeOut(function () { ... }, 2500);
expect(spy).toHaveBeenCalled();

1
Vielen Dank. Dies sind Integrationstests. Node.js ruft einen externen Dienst auf, der häufig langsam ist.
Brian Low

Dies ist brillant, es macht es möglich, das Timeout zu testen, ohne den Test auf das tatsächliche Timeout warten zu lassen
Guillaume

Auf diese Weise üben wir nicht den Lauf der Zeit aus und rufen das fn sofort auf, während das Original es nie vor dem nächsten Zyklus aufruft.
André Werlang

1

Hinzufügen: jasmine.DEFAULT_TIMEOUT_INTERVAL = yourTime;auf einer Hilfedatei hat bei mir funktioniert.


0

In meinem Fall hatte ich mehrere Testfälle und während ich die oben genannte Lösung mit verwendete, verwendete ich:

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

Das DEFAULT_TIMEOUT_INTERVAL wurde beim ersten Testfall nicht aktualisiert, daher musste ich Folgendes hinzufügen:

  beforeAll(() => {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
  })

zu meinem Code, um alle Tests erfolgreich auszuführen.


-16

Ändern Sie j $ .DEFAULT_TIMEOUT_INTERVAL in der folgenden Datei in 10000: npm \ node_modules \ jasmine-core \ lib \ jasmine-core


Nicht fruchtbar für Szenarien, in denen Bibliotheken bei jedem Test installiert werden. Beispiel: - Ausführen von CI in der Cloud.
domino_katrino
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.