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();
     });
});
Brian Low
quelle

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;
    });
});
Francisco
quelle
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
77

Pull-Anfrage für diese Funktion gesendet ( https://github.com/mhevery/jasmine-node/pull/142 )

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

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

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

     done();
  });

}, 5000); // set timeout to 5 seconds
Brian Low
quelle
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.

Colin May
quelle
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
});
d -_- b
quelle
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

danday74
quelle
3

Setzen Sie es nach describeAussage:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
Michał Kuliński
quelle
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();
ggozad
quelle
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.

Ivan Rangel
quelle
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.

Andreas Foteas
quelle
-16

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

Sharaj Rewoo
quelle
Nicht fruchtbar für Szenarien, in denen Bibliotheken bei jedem Test installiert werden. Beispiel: - Ausführen von CI in der Cloud.
domino_katrino