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.