Ändern Sie das Standardzeitlimit für Mokka

160

Wenn wir eine Unit-Test-Datei my-spec.js haben und mit Mokka laufen:

mocha my-spec.js

Das Standardzeitlimit beträgt 2000 ms. Es kann für einen Teiltest mit einem Befehlszeilenparameter überschrieben werden:

mocha my-spec.js --timeout 5000

Ist es möglich, das Standardzeitlimit für alle Tests global zu ändern? Das heißt, der Standardwert für das Zeitlimit unterscheidet sich von 2000 ms, wenn Sie Folgendes aufrufen:

mocha my-spec.js
lm.
quelle
Die offizielle Website von Mocha erklärt auch mehr dazu.
RaviRokkam

Antworten:

303

Standardmäßig liest Mocha eine Datei mit dem Namen test/mocha.opts, die Befehlszeilenargumente enthalten kann. Sie können also eine solche Datei erstellen, die Folgendes enthält:

--timeout 5000

Wenn Sie Mocha über die Befehlszeile ausführen, wird diese Datei gelesen und standardmäßig eine Zeitüberschreitung von 5 Sekunden festgelegt.

Eine andere Möglichkeit, die je nach Ihrer Situation besser sein kann, besteht darin, sie in einem describeAufruf der obersten Ebene in Ihrer Testdatei wie folgt festzulegen:

describe("something", function () {
    this.timeout(5000); 

    // tests...
});

Auf diese Weise können Sie eine Zeitüberschreitung nur pro Datei festlegen.

Sie können beide Methoden verwenden, wenn Sie einen globalen Standardwert von 5000 möchten, für einige Dateien jedoch etwas anderes festlegen möchten.


Beachten Sie, dass Sie im Allgemeinen keine Pfeilfunktion verwenden können, wenn Sie anrufen this.timeout(oder auf ein anderes Mitglied thisdieser Mokka-Sets für Sie zugreifen möchten ). Zum Beispiel funktioniert dies normalerweise nicht :

describe("something", () => {
    this.timeout(5000); //will not work

    // tests...
});

Dies liegt daran, dass eine Pfeilfunktion thisden Bereich übernimmt, in dem die Funktion angezeigt wird. Mocha ruft die Funktion mit einem guten Wert für auf, thisaber dieser Wert wird nicht innerhalb der Pfeilfunktion übergeben. In der Dokumentation zu Mocha heißt es zu diesem Thema :

Es wird davon abgeraten, Pfeilfunktionen („Lambdas“) an Mokka zu übergeben. Aufgrund der lexikalischen Bindung können solche Funktionen nicht auf den Mokka-Kontext zugreifen.

Louis
quelle
1
Danke für die Information. Ich habe zwar versucht, die Datei mocha.opts zu ändern, dies hat jedoch keine Auswirkungen.
lm.
2
Hast du es am richtigen Ort erstellt? Mocha ist sehr genau, wo diese Datei sein soll. Wenn Sie Mocha ausführen, wird Mocha /home/me/src/proj/nach dieser Datei suchen:/home/me/src/proj/test/mocha.opts
Louis
Vielen Dank . Jetzt wirkte sich die Änderung aus
lm.
this.timeout (10000); // Standardzeitlimit ^ TypeError: this.timeout ist in Suite keine Funktion. <anonymous> (/Users/jeff.l/Documents/workspace/unit-tests/mocha-chai_tests/checkoutTest.js:12:10)
Jeff Lowery
6
@ JeffLowery Verwenden Sie eine Pfeilfunktion? Pfeilfunktionen erstellen keine neuen this, was normalerweise dazu führt, dass this.timeoutFehler auftreten, wie Sie sie in Ihrem Kommentar anzeigen.
Louis
62

Wenn Sie nur die richtige Antwort hinzufügen, können Sie das Zeitlimit mit der Pfeilfunktion wie folgt einstellen:

it('Some test', () => {

}).timeout(5000)
Denis
quelle
7
Die Frage lautet "Standardzeitlimit für alle Tests global ändern". Ihre Antwort ändert nur einen Test. describe('suite', () => {...}).timeout(5000)funktioniert nicht
Aleung
Wie in der vorherigen Antwort ist die vorgeschlagene Lösung derzeit unwirksam. mochajs.org/#timeouts weist an, explizite setTimeoutAnweisungen in die Tests einzufügen .
Marco Faustinelli
Dies funktionierte für mich mit Mokka @ 5 (für einen bestimmten Test)
Fernando Gabrieli
@MarcoFaustinelli Sie verstehen die Dokumente falsch. Die setTimeouts haben nichts mit Mokka zu tun. Sie dienen dazu, die Auswirkungen von Timeout-Einstellungen zu demonstrieren.
Oligofren
33

Der Vollständigkeit halber hinzufügen. Wenn Sie (wie ich) ein Skript in Ihrer package.jsonDatei verwenden, fügen Sie einfach die --timeoutOption zu Mokka hinzu:

"scripts": {
  "test": "mocha 'test/**/*.js' --timeout 10000",
  "test-debug": "mocha --debug 'test/**/*.js' --timeout 10000"
},

Anschließend können Sie npm run testIhre Testsuite mit einem Zeitlimit von 10.000 Millisekunden ausführen.

Freedom_Ben
quelle
Falls jemand interessiert ist, können Sie in den meisten IDEs auch Mokka-Optionen für die Testausführung einfügen. Zum Beispiel für WebStorm können Sie dies (dh "--timeout 10000") unter Ausführen-> Konfigurationen bearbeiten-> Zusätzliche Mokka-Optionen eingeben.
Rubicon
25

In aktuellen Versionen von Mocha kann das Zeitlimit global wie folgt geändert werden:

mocha.timeout(5000);

Fügen Sie einfach die obige Zeile an einer beliebigen Stelle in Ihrer Testsuite hinzu, vorzugsweise oben in Ihrer Spezifikation oder in einem separaten Testhelfer.


In älteren Versionen und nur in einem Browser können Sie die globale Konfiguration mit ändern mocha.setup.

mocha.setup({ timeout: 5000 });

Die Dokumentation behandelt nicht die globale Zeitlimiteinstellung, bietet jedoch einige Beispiele zum Ändern des Zeitlimits in anderen gängigen Szenarien.

GOTO 0
quelle
5
Dies funktioniert in Node nicht. Siehe stackoverflow.com/a/47915119/893113 . Es scheint, dass die CLI-Option der einzige Weg ist.
Paulmelnikow
Ich arbeite auch nicht im Browser. Bis heute werden in der in der Antwort verlinkten Dokumentation keine timeoutParameter erwähnt. Im Gegenteil, mochajs.org/#timeouts weist an, explizite setTimeoutAnweisungen in die Tests einzufügen .
Marco Faustinelli
@MarcoFaustinelli Sie verstehen die Dokumente falsch. Die setTimeouts haben nichts mit Mokka zu tun. Sie dienen dazu, die Auswirkungen von Timeout-Einstellungen zu demonstrieren.
Oligofren