Modifica il timeout predefinito per la moka


161

Se abbiamo un file di test unit my-spec.js e in esecuzione con mocha:

mocha my-spec.js

Il timeout predefinito sarà 2000 ms. Può essere sovrascritto per un test parziale con un parametro della riga di comando:

mocha my-spec.js --timeout 5000

È possibile modificare il timeout predefinito a livello globale per tutti i test? vale a dire che il valore di timeout predefinito sarà diverso da 2000 ms quando si chiama:

mocha my-spec.js

Il sito ufficiale di Mocha spiega anche di più su questo.
RaviRokkam,

Risposte:


305

Per impostazione predefinita, Mocha leggerà un file denominato test/mocha.optsche può contenere argomenti della riga di comando. Quindi potresti creare un tale file che contiene:

--timeout 5000

Ogni volta che esegui Mocha dalla riga di comando, leggerà questo file e imposterà un timeout di 5 secondi per impostazione predefinita.

Un altro modo che può essere migliore a seconda della situazione è impostarlo in questo modo in una describechiamata di livello superiore nel file di test:

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

    // tests...
});

Ciò consentirebbe di impostare un timeout solo in base al file.

È possibile utilizzare entrambi i metodi se si desidera un valore predefinito globale di 5000 ma impostare qualcosa di diverso per alcuni file.


Nota che non puoi generalmente usare una funzione freccia se stai per chiamare this.timeout(o accedere a qualsiasi altro membro di thisquel Mocha impostato per te). Ad esempio, questo di solito non funziona :

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

    // tests...
});

Questo perché una funzione freccia prende thisdall'ambito in cui appare la funzione. Mocha chiamerà la funzione con un buon valore per thisma quel valore non viene passato all'interno della funzione freccia. La documentazione per Mocha dice su questo argomento :

Il passaggio delle funzioni freccia ("lambda") a Moka è scoraggiato. A causa del legame lessicale di questo, tali funzioni non sono in grado di accedere al contesto Mocha.


1
Grazie per l'informazione. Ma ho provato a modificare il file mocha.opts, ma non influisce.
Lm.

2
L'hai creato nel posto giusto? Mocha è molto specifica su dove vuole questo file. Se usi Mocha, Mocha /home/me/src/proj/cercherà questo file:/home/me/src/proj/test/mocha.opts
Louis,

Molte grazie . Ora il cambiamento ha influito
lm.

this.timeout (10000); // timeout predefinito ^ TypeError: this.timeout non è una funzione di Suite. <anonymous> (/Users/jeff.l/Documents/workspace/unit-tests/mocha-chai_tests/checkoutTest.js:12:10)
Jeff Lowery,

6
@JeffLowery Stai usando una funzione freccia? Le funzioni freccia non ne stabiliscono una nuova this, il che di solito si traduce in un this.timeouterrore come mostrato nel commento.
Louis,

62

Basta aggiungere alla risposta corretta è possibile impostare il timeout con la funzione freccia in questo modo:

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

}).timeout(5000)

7
La domanda è "modificare il timeout predefinito a livello globale per tutti i test". La tua risposta cambia solo un test. describe('suite', () => {...}).timeout(5000)non funziona
aleung,

Come nella risposta precedente, la soluzione proposta è attualmente inefficace. mochajs.org/#timeouts dice di inserire setTimeoutistruzioni esplicite all'interno dei test.
Marco Faustinelli,

questo ha funzionato per me con mocha @ 5 (per un test specifico)
Fernando Gabrieli il

@MarcoFaustinelli Stai fraintendendo i documenti. SetTimeouts non ha nulla a che fare con Mocha. Sono lì per dimostrare gli effetti delle impostazioni di timeout.
Oligofren,

33

Aggiungendo questo per completezza. Se (come me) usi uno script nel tuo package.jsonfile, aggiungi l' --timeoutopzione a mocha:

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

Quindi è possibile eseguire npm run testper eseguire la suite di test con il timeout impostato su 10.000 millisecondi.


Nel caso qualcuno fosse interessato, la maggior parte degli IDE consente anche di iniettare opzioni di moka per l'esecuzione del test; ad es. per WebStorm, è possibile inserire questo (ad es. "- timeout 10000") in Esegui-> Modifica configurazioni-> Opzioni Moka extra.
Rubicon

25

Nelle attuali versioni di Mocha, il timeout può essere modificato a livello globale in questo modo:

mocha.timeout(5000);

Basta aggiungere la riga sopra in qualsiasi punto della suite di test, preferibilmente nella parte superiore delle specifiche o in un supporto di prova separato.


Nelle versioni precedenti e solo in un browser, è possibile modificare la configurazione globale mediante mocha.setup.

mocha.setup({ timeout: 5000 });

La documentazione non copre l'impostazione del timeout globale, ma offre alcuni esempi su come modificare il timeout in altri scenari comuni.


5
Questo non funziona in Node. Vedi stackoverflow.com/a/47915119/893113 . Sembra che l'opzione CLI sia l'unico modo.
paulmelnikow,

Neanche io lavoro nel browser. Ad oggi, la documentazione collegata nella risposta non menziona alcun timeoutparametro. Al contrario, mochajs.org/#timeouts dice di inserire setTimeoutistruzioni esplicite all'interno dei test.
Marco Faustinelli,

@MarcoFaustinelli Stai fraintendendo i documenti. SetTimeouts non ha nulla a che fare con Mocha. Sono lì per dimostrare gli effetti delle impostazioni di timeout.
Oligofren,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.