Come aumentare il timeout per un singolo caso di test in moka


405

Sto inviando una richiesta di rete in un caso di test, ma a volte questo richiede più di 2 secondi (il timeout predefinito).

Come posso aumentare il timeout per un singolo caso di test?

Risposte:


669

Ecco qua: http://mochajs.org/#test-level

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

Per la funzione freccia utilizzare come segue:

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

23
il timeout è in millisecondi e il valore predefinito è 2000.
Ethan Mick,

47
Stavo usando le funzioni della freccia es6 e ho dovuto ricorrere alle vecchie definizioni di "funzione" perché "questo" funzionasse.
Aruna Herath,

1
Funziona anche con ganci, comebefore(function(done){this.timeout(5 * 1000);...});
JP

2
@AH Il motivo per cui la funzione freccia non ha funzionato è a causa di questo lessico
Tanner Faulkner,

11
c'è un modo per farlo funzionare con la funzione freccia? modifica: aggiungi .timeout(500)alla fine diit(...).timeout(500)
chovy

136

Se si desidera utilizzare le funzioni freccia es6, è possibile aggiungere .timeout(ms)a alla fine della itdefinizione:

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

Almeno questo funziona in Typescript.


3
Funziona, ma .timeoutnon è incluso nelle tipizzazioni DefinitelyTyped per mocha: i.imgur.com/jQbWCn1.png - L'utilizzo this.timeout(2000)o this.slow(500)con una vecchia funzione regolare funziona e compila senza errori
Leon Adler

3
Purtroppo, funziona solo per it, non funziona describe.
robrich,

3
c'è un modo per farlo per describe()o context()?
amorevole

1
@LeonAdler .timeoutè ora incluso nella tipizzazioni Mocha di DefinitelyTyped a: Mocha.IRunnable. Tuttavia, se si utilizza l'IDE Webstorm per l'esecuzione di questi test, una nota di cautela: per qualsiasi motivo, il plug-in di integrazione Mocha di WebStorm continua a non riconoscere i test Mocha con l' .timeout()aggiunta (il che significa che non viene visualizzato alcun pulsante " Esegui " accanto a loro), e quindi suggerisco di evitare le funzioni freccia per consentire this.timeout()invece l' uso di .
Jamie Birch,

Questo è perfetto. Per la funzione asincrona che restituisce una promessa, puoi lasciarla fuori ().
Billoverton,

72

(da quando mi sono imbattuto in questo oggi)

Fai attenzione quando usi la sintassi della freccia grassa ES2015:

Questo fallirà:

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: Perché non riesce:

Come menziona @atoth nei commenti, le funzioni della freccia grassa non hanno questo legame. Pertanto, non è possibile per la funzione it associarsi a questo del callback e fornire una funzione di timeout .

In conclusione : non utilizzare le funzioni freccia per le funzioni che richiedono un timeout maggiore.


2
Perché le funzioni freccia non lo hanno affatto. Maggiori informazioni qui: blog.getify.com/arrow-this
atoth

2
Sì, ma l'ho spiegato nella risposta. Vedi il mio commento // all'interno del codice. Probabilmente dovrei spiegarlo al di fuori del blocco di codice per renderlo più chiaro. questo esiste ma viene dall'ambito esterno.
chriskelly,

1
La mia spiegazione è più accurata. Non c'è alcun thislegame con le funzioni delle frecce - non allo stesso modo suggerirebbe che ne abbiano una sorta, solo diverse. Hanno solo ambiti lessicali. Non puoi vincolare questo inesistente. Ecco perché .bind, .callecc. Non funziona con esso.
atoth

1
È vero - e il tuo diritto è più preciso. Grazie
chriskelly il

1
Direi che è per questo che dovresti usare le frecce grasse solo quando ne hai bisogno, ma ho perso la cognizione di ciò che thisè.
xdumaine,

42

Se si utilizza in NodeJS, è possibile impostare il timeout in package.json

"test": "mocha --timeout 10000"

quindi puoi eseguire usando npm come:

npm test

1
Questo è per tutti i casi di test, non per un singolo test
garryp

Concordato che questo non risponde alla domanda, ma è stato sufficiente per il mio caso d'uso in cui non mi importava se fosse aumentato per tutti i test. Penso che molte persone che finiscono qui potrebbero non preoccuparsi se è per un test o tutti, quindi apprezzo che questa risposta sia qui.
Billoverton,

22

Dalla riga di comando:

mocha -t 100000 test.js

14
Ciò aumenta il timeout per tutti i casi di test piuttosto che "per un particolare caso di test" come fa la domanda.
Louis,

16

Potresti anche pensare di adottare un approccio diverso e di sostituire la chiamata alla risorsa di rete con uno stub o un oggetto finto. Usando Sinon , puoi separare l'app dal servizio di rete, concentrando i tuoi sforzi di sviluppo.


7
Non è del tutto irrilevante; frequentemente, ha senso stub la risposta di rete in modo da non fare affidamento sul fatto che quella macchina sia attiva o restituisca la risposta corretta. Se stai testando la risposta stessa, tuttavia, sì, devi ancora farlo.
Annunciato il

2
Sto usando sinon / mocha per costruire alcuni test di integrazione, quindi sono rilevanti timeout più alti.
jcollum,

9

Per la nave di prova su 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);
            });
    });
});

Nell'esempio il tempo di test è 4000 (4s).

Nota: setTimeout(done, 3500)è minore di quello che doneviene chiamato entro il tempo del test ma clearTimeout(timeOut)evita di usarlo per tutto questo tempo.


2

Questo ha funzionato per me! Impossibile trovare qualcosa con cui farlo funzionare prima ()

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 () ha funzionato perfettamente!
acidjazz
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.