So erhöhen Sie das Timeout für einen einzelnen Testfall in Mokka


405

Ich sende eine Netzwerkanforderung in einem Testfall, dies dauert jedoch manchmal länger als 2 Sekunden (Standardzeitlimit).

Wie erhöhe ich das Timeout für einen einzelnen Testfall?

Antworten:


669

Los geht's: http://mochajs.org/#test-level

it('accesses the network', function(done){
  this.timeout(500);
  [Put network code here, with done() in the callback]
})

Verwenden Sie für die Pfeilfunktion Folgendes:

it('accesses the network', (done) => {
  [Put network code here, with done() in the callback]
}).timeout(500);

23
Timeout ist in Millisekunden, und es ist standardmäßig 2000.
Ethan Mick

47
Ich habe es6-Pfeilfunktionen verwendet und musste auf alte 'Funktions'-Definitionen zurückgreifen, damit "dies" funktioniert.
Aruna Herath

1
Funktioniert auch für Hooks, wiebefore(function(done){this.timeout(5 * 1000);...});
JP

2
@AH Der Grund, warum die Pfeilfunktion nicht funktioniert hat, ist die lexikalische
Tanner Faulkner

11
Gibt es eine Möglichkeit, es mit der Pfeilfunktion zum Laufen zu bringen? bearbeiten: .timeout(500)zum Ende hinzufügenit(...).timeout(500)
chovy

136

Wenn Sie es6-Pfeilfunktionen verwenden möchten, können Sie .timeout(ms)am Ende Ihrer itDefinition ein hinzufügen :

it('should not timeout', (done) => {
    doLongThing().then(() => {
        done();
    });
}).timeout(5000);

Zumindest funktioniert dies in Typescript.


3
Dies funktioniert, ist aber .timeoutnicht in den DefinitelyTyped-Typisierungen für Mokka enthalten: i.imgur.com/jQbWCn1.png - Die Verwendung this.timeout(2000)oder Verwendung this.slow(500)einer regulären alten Funktion funktioniert und kompiliert fehlerfrei
Leon Adler

3
Leider funktioniert das nur für it, es funktioniert nicht für describe.
Robrich

3
Gibt es eine Möglichkeit, dies für describe()oder zu tun context()?
Chovy

1
@LeonAdler .timeoutist jetzt in den Mokka-Typisierungen von DefinitelyTyped enthalten unter : Mocha.IRunnable. Wenn Sie jedoch die Webstorm-IDE zum Ausführen dieser Tests verwenden, ist Vorsicht geboten: Aus welchem ​​Grund auch immer, das Mocha-Integrations-Plugin von WebStorm erkennt Mocha-Tests mit .timeout()angehängten Tests immer noch nicht (was bedeutet, dass keine Schaltfläche "Ausführen" neben ihnen angezeigt wird). und daher befürworte ich, Pfeilfunktionen zu vermeiden, um this.timeout()stattdessen die Verwendung zu ermöglichen .
Jamie Birch

Dies ist perfekt. Für die asynchrone Funktion, die ein Versprechen zurückgibt, können Sie done () weglassen.
Billoverton

72

(seit ich heute darauf gestoßen bin)

Seien Sie vorsichtig, wenn Sie die ES2015-Fettpfeilsyntax verwenden:

Dies wird fehlschlagen:

it('accesses the network', done => {

  this.timeout(500); // will not work

  // *this* binding refers to parent function scope in fat arrow functions!
  // i.e. the *this* object of the describe function

  done();
});

EDIT: Warum es fehlschlägt:

Wie @atoth in den Kommentaren erwähnt, Fett Pfeil Funktionen haben keine eigene diese Bindung. Daher ist es der it- Funktion nicht möglich , sich an diesen Rückruf zu binden und eine Timeout- Funktion bereitzustellen .

Fazit : Verwenden Sie keine Pfeilfunktionen für Funktionen, die eine längere Zeitüberschreitung erfordern.


2
Weil Pfeilfunktionen dies überhaupt nicht haben. Lesen Sie hier mehr: blog.getify.com/arrow-this
am

2
Ja, aber ich habe dies in der Antwort erklärt. Siehe meinen Kommentar. // im Code. Ich sollte es wahrscheinlich außerhalb des Codeblocks erklären, um es klarer zu machen. Dies existiert zwar, kommt aber aus dem äußeren Bereich.
Chriskelly

1
Meine Erklärung ist genauer. Es gibt keine thisBindung für Pfeilfunktionen - nicht der gleiche Weg würde bedeuten, dass sie eine Art haben, nur anders. Sie haben nur lexikalische Bereiche. Sie können nicht vorhandene nicht binden. Aus diesem Grunde .bind, .callist etc. nicht mit ihm arbeiten.
am

1
Das stimmt - und Ihr Recht ist genauer. Danke
chriskelly

1
Ich würde sagen, deshalb sollten Sie nur dann fette Pfeile verwenden, wenn Sie sie brauchen, aber ich habe den Überblick verloren, was thisist.
Xdumaine

42

Wenn Sie in NodeJS verwenden, können Sie das Zeitlimit in package.json festlegen

"test": "mocha --timeout 10000"

dann kannst du mit npm laufen wie:

npm test

1
Das ist für alle Testfälle, nicht für einen einzigen Testfall
Garryp

Einverstanden, dass dies die Frage nicht beantwortet, aber es war ausreichend für meinen Anwendungsfall, bei dem es mir egal war, ob es für alle Tests zunahm. Ich denke, vielen Leuten, die hier landen, ist es vielleicht egal, ob es sich um einen oder alle Tests handelt. Deshalb schätze ich es, dass diese Antwort hier ist.
Billoverton

22

Über die Befehlszeile:

mocha -t 100000 test.js

14
Dies erhöht das Zeitlimit für alle Testfälle und nicht "für einen bestimmten Testfall", wie in der Frage gestellt.
Louis

16

Sie könnten auch überlegen, einen anderen Ansatz zu wählen und den Aufruf der Netzwerkressource durch einen Stub oder ein Scheinobjekt zu ersetzen. Mit Sinon können Sie die App vom Netzwerkdienst entkoppeln und Ihre Entwicklungsanstrengungen konzentrieren.


7
Es ist nicht ganz irrelevant; Häufig ist es sinnvoll, die Netzwerkantwort zu stubben, damit Sie nicht darauf angewiesen sind, dass der Computer aktiv ist oder die richtige Antwort zurückgibt. Wenn Sie die Antwort selbst testen, müssen Sie dies dennoch tun.
aendrew

2
Ich verwende Sinon / Mokka, um einige Integrationstests zu erstellen, daher sind höhere Zeitüberschreitungen relevant.
JCollum

9

Für Testfahrten am Express:

const request = require('supertest');
const server = require('../bin/www');

describe('navegation', () => {
    it('login page', function(done) {
        this.timeout(4000);
        const timeOut = setTimeout(done, 3500);

        request(server)
            .get('/login')
            .expect(200)
            .then(res => {
                res.text.should.include('Login');
                clearTimeout(timeOut);
                done();
            })
            .catch(err => {
                console.log(this.test.fullTitle(), err);
                clearTimeout(timeOut);
                done(err);
            });
    });
});

Im Beispiel beträgt die Testzeit 4000 (4 s).

Hinweis: setTimeout(done, 3500)ist geringfügig, als doneinnerhalb der Testzeit aufgerufen wird, clearTimeout(timeOut)es wird jedoch vermieden, dass diese Zeit verwendet wird.


2

Das hat bei mir funktioniert! Konnte vorher nichts finden, mit dem es funktioniert ()

describe("When in a long running test", () => {
  it("Should not time out with 2000ms", async () => {
    let service = new SomeService();
    let result = await service.callToLongRunningProcess();
    expect(result).to.be.true;
  }).timeout(10000); // Custom Timeout 
});

.timeout () hat perfekt funktioniert!
Acidjazz
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.