Saya mengirimkan permintaan jaringan dalam sebuah test case, tetapi ini kadang-kadang membutuhkan waktu lebih dari 2 detik (batas waktu default).
Bagaimana cara menambah batas waktu untuk satu test case?
Saya mengirimkan permintaan jaringan dalam sebuah test case, tetapi ini kadang-kadang membutuhkan waktu lebih dari 2 detik (batas waktu default).
Bagaimana cara menambah batas waktu untuk satu test case?
Jawaban:
Ini dia: http://mochajs.org/#test-level
it('accesses the network', function(done){
this.timeout(500);
[Put network code here, with done() in the callback]
})
Untuk fungsi panah gunakan sebagai berikut:
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)
pada akhirit(...).timeout(500)
Jika Anda ingin menggunakan fungsi panah ES6, Anda dapat menambahkan a .timeout(ms)
ke akhir it
definisi Anda :
it('should not timeout', (done) => {
doLongThing().then(() => {
done();
});
}).timeout(5000);
Paling tidak ini bekerja di naskah.
.timeout
tidak termasuk dalam pengetikan DefinitelyTyped untuk mocha: i.imgur.com/jQbWCn1.png - Menggunakan this.timeout(2000)
atau this.slow(500)
dengan fungsi fungsi lama yang biasa berfungsi dan kompilasi tanpa kesalahan
it
, tidak berhasil describe
.
describe()
atau context()
?
.timeout
sekarang termasuk dalam Mocha typings DefinitelyTyped di: Mocha.IRunnable
. Namun, jika Anda menggunakan IDE Webstorm untuk menjalankan tes ini, sebuah peringatan: untuk alasan apa pun, plugin integrasi Mocha WebStorm masih tidak mengenali tes Mocha dengan .timeout()
menambahkan (artinya bahwa tidak ada tombol 'jalankan' muncul di sebelahnya), dan dengan demikian saya menganjurkan menghindari fungsi panah untuk memungkinkan penggunaan this.timeout()
gantinya.
(Karena saya mengalami ini hari ini)
Hati-hati saat menggunakan sintaks panah lemak ES2015:
Ini akan gagal:
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: Mengapa gagal:
Seperti @atoth menyebutkan dalam komentar, fungsi panah gemuk tidak memiliki ikatan ini sendiri . Oleh karena itu, tidak mungkin untuk itu berfungsi untuk mengikat ini dari callback dan memberikan batas waktu fungsi.
Intinya : Jangan gunakan fungsi panah untuk fungsi yang membutuhkan batas waktu lebih lama.
this
pengikatan pada fungsi panah - tidak dengan cara yang sama akan menyarankan mereka memiliki semacam, hanya berbeda. Mereka hanya memiliki lingkup leksikal. Anda tidak dapat mengikat yang tidak ada ini. Itu sebabnya .bind
,, .call
dll. Tidak bekerja dengannya.
this
itu.
Jika Anda menggunakan di NodeJS maka Anda dapat mengatur batas waktu di package.json
"test": "mocha --timeout 10000"
maka Anda dapat menjalankan menggunakan npm seperti:
npm test
Anda mungkin juga berpikir tentang mengambil pendekatan yang berbeda, dan mengganti panggilan ke sumber daya jaringan dengan objek rintisan atau tiruan. Dengan menggunakan Sinon , Anda dapat memisahkan aplikasi dari layanan jaringan, memfokuskan upaya pengembangan Anda.
Untuk ujian navegation pada 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);
});
});
});
Dalam contoh waktu pengujian adalah 4000 (4s).
Catatan: setTimeout(done, 3500)
minor untuk daripada done
yang disebut dalam waktu tes tetapi clearTimeout(timeOut)
ia menghindari daripada digunakan selama ini.
Ini berhasil untuk saya! Tidak dapat menemukan apa pun untuk membuatnya bekerja sebelumnya ()
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
});