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?
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:
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);
before(function(done){this.timeout(5 * 1000);...});
.timeout(500)
alla fine diit(...).timeout(500)
Se si desidera utilizzare le funzioni freccia es6, è possibile aggiungere .timeout(ms)
a alla fine della it
definizione:
it('should not timeout', (done) => {
doLongThing().then(() => {
done();
});
}).timeout(5000);
Almeno questo funziona in Typescript.
.timeout
non è 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
it
, non funziona describe
.
describe()
o context()
?
.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 .
(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.
this
legame 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
, .call
ecc. Non funziona con esso.
this
è.
Se si utilizza in NodeJS, è possibile impostare il timeout in package.json
"test": "mocha --timeout 10000"
quindi puoi eseguire usando npm come:
npm test
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.
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 done
viene chiamato entro il tempo del test ma clearTimeout(timeOut)
evita di usarlo per tutto questo tempo.
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
});