Cara menambah batas waktu untuk satu uji kasus di moka

405

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?

Mahendra S
sumber

Jawaban:

669

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);
Dan Kohn
sumber
23
batas waktu dalam milidetik, dan defaultnya 2000.
Ethan Mick
47
Saya menggunakan fungsi panah es6 dan harus kembali ke definisi 'fungsi' lama agar "ini" berfungsi.
Aruna Herath
1
Juga berfungsi untuk kait, sepertibefore(function(done){this.timeout(5 * 1000);...});
JP
2
@AH Alasan fungsi panah tidak berfungsi adalah karena leksikal ini
Tanner Faulkner
11
apakah ada cara untuk membuatnya berfungsi dengan fungsi panah? sunting: tambahkan .timeout(500)pada akhirit(...).timeout(500)
chovy
136

Jika Anda ingin menggunakan fungsi panah ES6, Anda dapat menambahkan a .timeout(ms)ke akhir itdefinisi Anda :

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

Paling tidak ini bekerja di naskah.

Chris Sparrow
sumber
3
Ini berfungsi, tetapi .timeouttidak 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
Leon Adler
3
Sayangnya, ini hanya berfungsi untuk it, tidak berhasil describe.
Robrich
3
apakah ada cara untuk melakukan ini untuk describe()atau context()?
chovy
1
@LeonAdler .timeoutsekarang 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.
Jamie Birch
Ini sempurna. Untuk fungsi async mengembalikan janji, Anda dapat mengabaikannya ().
billoverton
72

(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.

chriskelly
sumber
2
Karena fungsi panah tidak memiliki ini sama sekali. Baca lebih lanjut di sini: blog.getify.com/arrow-ini
atoth
2
Ya tapi saya sudah menjelaskan ini dalam jawabannya. Lihat komentar saya. // di dalam kode. Saya mungkin harus menjelaskannya di luar blok kode untuk membuatnya lebih jelas. ini memang ada tetapi itu berasal dari lingkup luar.
chriskelly
1
Penjelasan saya lebih akurat. Tidak ada thispengikatan 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,, .calldll. Tidak bekerja dengannya.
atoth
1
Itu benar - dan hak Anda lebih akurat. Terima kasih
chriskelly
1
Saya akan mengatakan bahwa inilah mengapa Anda hanya harus menggunakan panah gemuk saat Anda membutuhkannya, tetapi saya tidak tahu apa thisitu.
xdumaine
42

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

sumber
1
Itu untuk semua test case, bukan test case tunggal
garryp
Setuju bahwa ini tidak menjawab pertanyaan, tapi cukup untuk kasus penggunaan saya di mana saya tidak peduli jika meningkat untuk semua tes. Saya pikir banyak orang yang berakhir di sini mungkin tidak peduli apakah itu untuk satu tes atau semua, jadi saya menghargai jawaban ini ada di sini.
billoverton
22

Dari baris perintah:

mocha -t 100000 test.js
andrey
sumber
14
Ini meningkatkan batas waktu untuk semua kasus uji daripada "untuk kasus uji tertentu" seperti pertanyaan yang diajukan.
Louis
16

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.

David Souther
sumber
7
Itu tidak sepenuhnya tidak relevan; sering kali, masuk akal untuk mematikan respons jaringan sehingga Anda tidak bergantung pada mesin yang menghidupkan atau mengembalikan respons yang benar. Namun, jika Anda menguji respons itu sendiri, maka ya, Anda masih perlu melakukannya.
aendrew
2
Saya menggunakan sinon / moka untuk membangun beberapa tes integrasi, jadi batas waktu lebih tinggi relevan.
jcollum
9

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 doneyang disebut dalam waktu tes tetapi clearTimeout(timeOut)ia menghindari daripada digunakan selama ini.

alditis
sumber
2

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 
});
Otpidus
sumber
.timeout () bekerja dengan sempurna!
acidjazz