ฉันกำลังส่งคำขอเครือข่ายในกรณีทดสอบ แต่บางครั้งใช้เวลานานกว่า 2 วินาที (การหมดเวลาเริ่มต้น)
ฉันจะเพิ่มการหมดเวลาสำหรับกรณีทดสอบเดียวได้อย่างไร
ฉันกำลังส่งคำขอเครือข่ายในกรณีทดสอบ แต่บางครั้งใช้เวลานานกว่า 2 วินาที (การหมดเวลาเริ่มต้น)
ฉันจะเพิ่มการหมดเวลาสำหรับกรณีทดสอบเดียวได้อย่างไร
คำตอบ:
ไปเลย: http://mochajs.org/#test-level
it('accesses the network', function(done){
this.timeout(500);
[Put network code here, with done() in the callback]
})
สำหรับฟังก์ชั่น arrow ใช้ดังนี้:
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)
ไปยังจุดสิ้นสุดit(...).timeout(500)
หากคุณต้องการใช้ฟังก์ชั่นลูกศร es6 คุณสามารถเพิ่ม a .timeout(ms)
ไว้ท้ายit
คำจำกัดความของคุณ:
it('should not timeout', (done) => {
doLongThing().then(() => {
done();
});
}).timeout(5000);
อย่างน้อยก็ใช้งานได้ใน typescript
.timeout
ไม่รวมอยู่ในการพิมพ์ DefinitelyTyped สำหรับ mocha: i.imgur.com/jQbWCn1.png - การใช้this.timeout(2000)
หรือthis.slow(500)
กับการทำงานปกติทั่วไปและคอมไพล์โดยไม่มีข้อผิดพลาด
it
describe
describe()
หรือcontext()
?
.timeout
จะรวมอยู่ในขณะนี้ใน DefinitelyTyped ของ typings Mocha Mocha.IRunnable
ที่: อย่างไรก็ตามหากคุณใช้ Webstorm IDE เพื่อทำการทดสอบเหล่านี้ข้อควรระวัง: ไม่ว่าด้วยเหตุผลใดปลั๊กอินการรวม Mocha ของ WebStorm ยังไม่รู้จักการทดสอบ Mocha ที่.timeout()
ต่อท้าย (หมายความว่าไม่มีปุ่ม 'run' ปรากฏอยู่ข้างๆ) และฉันจึงแนะนำให้หลีกเลี่ยงฟังก์ชั่นลูกศรเพื่ออนุญาตให้ใช้this.timeout()
แทน
(ตั้งแต่ฉันวิ่งเข้าไปในวันนี้)
ระวังเมื่อใช้ไวยากรณ์ลูกศรไขมัน ES2015:
สิ่งนี้จะล้มเหลว:
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();
});
แก้ไข: ทำไมมันล้มเหลว:
@atoth กล่าวถึงในความคิดเห็นฟังก์ชั่นลูกศรไขมันไม่ได้มีผลผูกพันของตัวเองนี้ ดังนั้นจึงเป็นไปไม่ได้สำหรับมันทำงานเชื่อมโยงกับเรื่องนี้ของการเรียกกลับและให้หมดเวลาฟังก์ชั่น
Bottom line : อย่าใช้ฟังก์ชั่นลูกศรสำหรับฟังก์ชั่นที่ต้องการการหมดเวลาเพิ่มขึ้น
this
ฟังก์ชั่นลูกศร - วิธีเดียวกับที่แนะนำให้พวกเขามีบางอย่างแตกต่างกัน พวกเขามีขอบเขตศัพท์ คุณไม่สามารถผูกสิ่งนี้ที่ไม่มีอยู่ นั่นเป็นเหตุผลที่.bind
, .call
ฯลฯ ไม่ได้ทำงานกับมัน
this
มันคืออะไร
หากคุณกำลังใช้ใน NodeJS คุณสามารถตั้งค่าการหมดเวลาใน package.json
"test": "mocha --timeout 10000"
จากนั้นคุณสามารถเรียกใช้โดยใช้ NPM เช่น:
npm test
จากบรรทัดคำสั่ง:
mocha -t 100000 test.js
คุณอาจคิดถึงวิธีอื่นและเปลี่ยนการเรียกไปยังทรัพยากรเครือข่ายด้วยออบเจกต์ stub หรือ mock ด้วยการใช้Sinonคุณสามารถแยกแอปออกจากบริการเครือข่ายโดยมุ่งเน้นการพัฒนาของคุณ
สำหรับการทดสอบ navegation บน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);
});
});
});
ในตัวอย่างเวลาทดสอบคือ 4000 (4s)
หมายเหตุ: setTimeout(done, 3500)
มีค่าน้อยกว่าที่done
เรียกว่าภายในระยะเวลาของการทดสอบ แต่clearTimeout(timeOut)
จะหลีกเลี่ยงมากกว่าที่ใช้ตลอดเวลา
สิ่งนี้ได้ผลสำหรับฉัน! ไม่พบสิ่งใดที่จะทำให้มันทำงานกับก่อน ()
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
});