Làm cách nào để tăng thời gian chờ cho một trường hợp thử nghiệm trong mocha


405

Tôi đang gửi yêu cầu mạng trong trường hợp thử nghiệm, nhưng điều này đôi khi mất hơn 2 giây (thời gian chờ mặc định).

Làm cách nào để tăng thời gian chờ cho một trường hợp thử nghiệm?

Câu trả lời:


669

Ở đây bạn đi: http://mochajs.org/#test-level

it('accesses the network', function(done){
  this.timeout(500);
  [Put network code here, with done() in the callback]
})

Đối với chức năng mũi tên sử dụng như sau:

it('accesses the network', (done) => {
  [Put network code here, with done() in the callback]
}).timeout(500);

23
thời gian chờ là tính bằng mili giây và mặc định là 2000.
Ethan Mick

47
Tôi đã sử dụng các hàm mũi tên es6 và phải quay lại các định nghĩa 'hàm' cũ để "cái này" hoạt động.
Aruna Herath

1
Cũng hoạt động cho hook, nhưbefore(function(done){this.timeout(5 * 1000);...});
JP

2
@AH Lý do chức năng mũi tên không hoạt động là vì từ vựng này
Tanner Faulkner

11
Có cách nào để làm cho nó hoạt động với chức năng mũi tên? chỉnh sửa: thêm .timeout(500)vào cuối củait(...).timeout(500)
chovy

136

Nếu bạn muốn sử dụng các hàm mũi tên es6, bạn có thể thêm a .timeout(ms)vào cuối itđịnh nghĩa của mình :

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

Ít nhất điều này hoạt động trong Bản in.


3
Điều này hoạt động, nhưng .timeoutkhông được bao gồm trong các kiểu chữ DefiniteTyped cho mocha: i.imgur.com/jQbWCn1.png - Sử dụng this.timeout(2000)hoặc this.slow(500)với một chức năng cũ thông thường hoạt động và biên dịch không có lỗi
Leon Adler

3
Đáng buồn thay, điều này chỉ hoạt động cho it, nó không hoạt động describe.
robrich

3
Có cách nào để làm điều này cho describe()hay context()?
chovy

1
@LeonAdler .timeouthiện được bao gồm trong các kiểu đánh dấu Mocha của DefiniteTyped tại : Mocha.IRunnable. Tuy nhiên, nếu bạn đang sử dụng IDE Webstorm để chạy các thử nghiệm này, một lưu ý cần lưu ý: vì bất kỳ lý do gì, plugin tích hợp Mocha của WebStorm vẫn không nhận ra các thử nghiệm Mocha có .timeout()gắn thêm (có nghĩa là không có nút 'chạy' nào xuất hiện bên cạnh chúng), và do đó tôi ủng hộ việc tránh các chức năng mũi tên để cho phép sử dụng this.timeout()thay thế.
Jamie Birch

Đây là hoàn hảo. Đối với chức năng async trả lại một lời hứa, bạn có thể bỏ qua ().
billoverton

72

(kể từ hôm nay tôi gặp phải vấn đề này)

Cẩn thận khi sử dụng cú pháp mũi tên chất béo ES2015:

Điều này sẽ thất bại:

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: Tại sao nó thất bại:

Như @atoth đề cập trong các ý kiến, mũi tên mỡ chức năng không có của riêng của họ này ràng buộc. Vì vậy, nó không thể cho hoạt động để ràng buộc vào này của callback và cung cấp một thời gian chờ chức năng.

Dòng dưới cùng : Không sử dụng các hàm mũi tên cho các chức năng cần thời gian chờ tăng.


2
Bởi vì các chức năng mũi tên hoàn toàn không có điều này. Đọc thêm tại đây: blog.getify.com/arrow-this
atoth

2
Có nhưng tôi đã giải thích điều này trong câu trả lời. Xem bình luận của tôi. // bên trong mã. Tôi có lẽ nên giải thích nó bên ngoài khối mã để làm cho nó rõ ràng hơn. Điều này không tồn tại nhưng nó đến từ phạm vi bên ngoài.
chriskelly

1
Lời giải thích của tôi chính xác hơn. Không có thisràng buộc về các chức năng mũi tên - không giống như cách gợi ý rằng chúng có một số loại, chỉ khác nhau. Họ chỉ có phạm vi từ vựng. Bạn không thể ràng buộc không tồn tại này. Đó là lý do tại sao .bind, .callvv không hoạt động với nó.
vào

1
Điều đó đúng - và quyền của bạn chính xác hơn. Cảm ơn
chriskelly

1
Tôi nói rằng đây là lý do tại sao bạn chỉ nên sử dụng mũi tên béo khi bạn cần, nhưng tôi đã mất dấu vết của những gì this.
xdumaine

42

Nếu bạn đang sử dụng trong NodeJS thì bạn có thể đặt thời gian chờ trong pack.json

"test": "mocha --timeout 10000"

sau đó bạn có thể chạy bằng npm như:

npm test

1
Đó là cho tất cả các trường hợp thử nghiệm, không phải là một trường hợp thử nghiệm duy nhất
garryp

Đồng ý rằng điều này không trả lời câu hỏi, nhưng nó đủ cho trường hợp sử dụng của tôi khi tôi không quan tâm nếu nó tăng cho tất cả các bài kiểm tra. Tôi nghĩ rằng rất nhiều người cuối cùng ở đây có thể không quan tâm nếu đó là cho một bài kiểm tra hay tất cả, vì vậy tôi đánh giá cao câu trả lời này ở đây.
billoverton

22

Từ dòng lệnh:

mocha -t 100000 test.js

14
Điều này làm tăng thời gian chờ cho tất cả các trường hợp thử nghiệm thay vì "cho một trường hợp thử nghiệm cụ thể" như câu hỏi yêu cầu.
Louis

16

Bạn cũng có thể nghĩ về việc thực hiện một cách tiếp cận khác và thay thế cuộc gọi đến tài nguyên mạng bằng một đối tượng còn sơ khai hoặc giả. Sử dụng Sinon , bạn có thể tách ứng dụng khỏi dịch vụ mạng, tập trung nỗ lực phát triển của bạn.


7
Nó không hoàn toàn không liên quan; thông thường, sẽ rất hợp lý khi ngắt phản hồi mạng để bạn không phụ thuộc vào máy đó đang hoạt động hoặc trả lại phản hồi chính xác. Tuy nhiên, nếu bạn đang kiểm tra phản hồi, thì ừ, bạn vẫn cần phải thực hiện.
aendrew

2
Tôi đang sử dụng sinon / mocha để xây dựng một số thử nghiệm tích hợp, vì vậy thời gian chờ cao hơn có liên quan.
jcollum

9

Đối với thử nghiệm navegation trên 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);
            });
    });
});

Trong ví dụ thời gian thử nghiệm là 4000 (4s).

Lưu ý: setTimeout(done, 3500)là nhỏ hơn so với doneđược gọi trong thời gian thử nghiệm nhưng clearTimeout(timeOut)nó tránh hơn được sử dụng tất cả các thời gian này.


2

Điều này làm việc cho tôi! Không thể tìm thấy bất cứ điều gì để làm cho nó hoạt động với trước ()

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 () đã hoạt động hoàn hảo!
acidjazz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.