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?
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:
Ở đâ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);
before(function(done){this.timeout(5 * 1000);...});
.timeout(500)
vào cuối củait(...).timeout(500)
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.
.timeout
khô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
it
, nó không hoạt động describe
.
describe()
hay context()
?
.timeout
hiệ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ế.
(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 nó 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.
this
rà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
, .call
vv không hoạt động với nó.
this
.
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
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.
Đố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.
Đ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
});