Ich sende eine Netzwerkanforderung in einem Testfall, dies dauert jedoch manchmal länger als 2 Sekunden (Standardzeitlimit).
Wie erhöhe ich das Timeout für einen einzelnen Testfall?
Ich sende eine Netzwerkanforderung in einem Testfall, dies dauert jedoch manchmal länger als 2 Sekunden (Standardzeitlimit).
Wie erhöhe ich das Timeout für einen einzelnen Testfall?
Antworten:
Los geht's: http://mochajs.org/#test-level
it('accesses the network', function(done){
this.timeout(500);
[Put network code here, with done() in the callback]
})
Verwenden Sie für die Pfeilfunktion Folgendes:
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)
zum Ende hinzufügenit(...).timeout(500)
Wenn Sie es6-Pfeilfunktionen verwenden möchten, können Sie .timeout(ms)
am Ende Ihrer it
Definition ein hinzufügen :
it('should not timeout', (done) => {
doLongThing().then(() => {
done();
});
}).timeout(5000);
Zumindest funktioniert dies in Typescript.
.timeout
nicht in den DefinitelyTyped-Typisierungen für Mokka enthalten: i.imgur.com/jQbWCn1.png - Die Verwendung this.timeout(2000)
oder Verwendung this.slow(500)
einer regulären alten Funktion funktioniert und kompiliert fehlerfrei
it
, es funktioniert nicht für describe
.
describe()
oder zu tun context()
?
.timeout
ist jetzt in den Mokka-Typisierungen von DefinitelyTyped enthalten unter : Mocha.IRunnable
. Wenn Sie jedoch die Webstorm-IDE zum Ausführen dieser Tests verwenden, ist Vorsicht geboten: Aus welchem Grund auch immer, das Mocha-Integrations-Plugin von WebStorm erkennt Mocha-Tests mit .timeout()
angehängten Tests immer noch nicht (was bedeutet, dass keine Schaltfläche "Ausführen" neben ihnen angezeigt wird). und daher befürworte ich, Pfeilfunktionen zu vermeiden, um this.timeout()
stattdessen die Verwendung zu ermöglichen .
(seit ich heute darauf gestoßen bin)
Seien Sie vorsichtig, wenn Sie die ES2015-Fettpfeilsyntax verwenden:
Dies wird fehlschlagen:
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: Warum es fehlschlägt:
Wie @atoth in den Kommentaren erwähnt, Fett Pfeil Funktionen haben keine eigene diese Bindung. Daher ist es der it- Funktion nicht möglich , sich an diesen Rückruf zu binden und eine Timeout- Funktion bereitzustellen .
Fazit : Verwenden Sie keine Pfeilfunktionen für Funktionen, die eine längere Zeitüberschreitung erfordern.
this
Bindung für Pfeilfunktionen - nicht der gleiche Weg würde bedeuten, dass sie eine Art haben, nur anders. Sie haben nur lexikalische Bereiche. Sie können nicht vorhandene nicht binden. Aus diesem Grunde .bind
, .call
ist etc. nicht mit ihm arbeiten.
this
ist.
Wenn Sie in NodeJS verwenden, können Sie das Zeitlimit in package.json festlegen
"test": "mocha --timeout 10000"
dann kannst du mit npm laufen wie:
npm test
Sie könnten auch überlegen, einen anderen Ansatz zu wählen und den Aufruf der Netzwerkressource durch einen Stub oder ein Scheinobjekt zu ersetzen. Mit Sinon können Sie die App vom Netzwerkdienst entkoppeln und Ihre Entwicklungsanstrengungen konzentrieren.
Für Testfahrten am 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);
});
});
});
Im Beispiel beträgt die Testzeit 4000 (4 s).
Hinweis: setTimeout(done, 3500)
ist geringfügig, als done
innerhalb der Testzeit aufgerufen wird, clearTimeout(timeOut)
es wird jedoch vermieden, dass diese Zeit verwendet wird.
Das hat bei mir funktioniert! Konnte vorher nichts finden, mit dem es funktioniert ()
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
});