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?

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);

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.


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.


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

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

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.


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.


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 
});

.timeout () bekerja dengan sempurna!
acidjazz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.