วิธีเพิ่มการหมดเวลาสำหรับกรณีทดสอบเดียวในมอคค่า


405

ฉันกำลังส่งคำขอเครือข่ายในกรณีทดสอบ แต่บางครั้งใช้เวลานานกว่า 2 วินาที (การหมดเวลาเริ่มต้น)

ฉันจะเพิ่มการหมดเวลาสำหรับกรณีทดสอบเดียวได้อย่างไร

คำตอบ:


669

ไปเลย: 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);

23
หมดเวลาเป็นมิลลิวินาทีและจะมีค่าเริ่มต้น 2000
Ethan Mick

47
ฉันกำลังใช้ฟังก์ชั่นลูกศร es6 และต้องย้อนกลับไปนิยาม 'ฟังก์ชั่น' เก่าเพื่อให้ "นี่" ทำงานได้
Aruna Herath

1
ใช้ได้กับตะขอเช่นbefore(function(done){this.timeout(5 * 1000);...});
JP

2
@AH เหตุผลที่ฟังก์ชั่นลูกศรไม่ทำงานเป็นเพราะคำศัพท์นี้
Tanner Faulkner

11
มีวิธีที่จะให้มันทำงานกับฟังก์ชั่นลูกศรได้หรือไม่? แก้ไข: เพิ่ม.timeout(500)ไปยังจุดสิ้นสุดit(...).timeout(500)
chovy

136

หากคุณต้องการใช้ฟังก์ชั่นลูกศร es6 คุณสามารถเพิ่ม a .timeout(ms)ไว้ท้ายitคำจำกัดความของคุณ:

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

อย่างน้อยก็ใช้งานได้ใน typescript


3
ใช้งานได้ แต่.timeoutไม่รวมอยู่ในการพิมพ์ DefinitelyTyped สำหรับ mocha: i.imgur.com/jQbWCn1.png - การใช้this.timeout(2000)หรือthis.slow(500)กับการทำงานปกติทั่วไปและคอมไพล์โดยไม่มีข้อผิดพลาด
Leon Adler

3
น่าเศร้านี้ทำงานเฉพาะสำหรับมันไม่ทำงานสำหรับit describe
robrich

3
มีวิธีทำเช่นนี้เพื่อdescribe()หรือcontext()?
chovy

1
@LeonAdler .timeoutจะรวมอยู่ในขณะนี้ใน DefinitelyTyped ของ typings Mocha Mocha.IRunnableที่: อย่างไรก็ตามหากคุณใช้ Webstorm IDE เพื่อทำการทดสอบเหล่านี้ข้อควรระวัง: ไม่ว่าด้วยเหตุผลใดปลั๊กอินการรวม Mocha ของ WebStorm ยังไม่รู้จักการทดสอบ Mocha ที่.timeout()ต่อท้าย (หมายความว่าไม่มีปุ่ม 'run' ปรากฏอยู่ข้างๆ) และฉันจึงแนะนำให้หลีกเลี่ยงฟังก์ชั่นลูกศรเพื่ออนุญาตให้ใช้this.timeout()แทน
Jamie Birch

มันสมบูรณ์แบบ สำหรับฟังก์ชั่น async ส่งคืนสัญญาที่คุณสามารถทำได้ ()
billoverton

72

(ตั้งแต่ฉันวิ่งเข้าไปในวันนี้)

ระวังเมื่อใช้ไวยากรณ์ลูกศรไขมัน 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 : อย่าใช้ฟังก์ชั่นลูกศรสำหรับฟังก์ชั่นที่ต้องการการหมดเวลาเพิ่มขึ้น


2
เพราะฟังก์ชั่นลูกศรไม่มีสิ่งนี้เลย อ่านเพิ่มเติมได้ที่นี่: blog.getify.com/arrow-this
atoth

2
ใช่ แต่ฉันได้อธิบายเรื่องนี้ในคำตอบแล้ว ดูความคิดเห็นของฉัน // ภายในโค้ด ฉันควรจะอธิบายมันนอกบล็อกรหัสเพื่อให้ชัดเจน สิ่งนี้มีอยู่ แต่มาจากขอบเขตด้านนอก
chriskelly

1
คำอธิบายของฉันถูกต้องมากขึ้น ไม่มีthisฟังก์ชั่นลูกศร - วิธีเดียวกับที่แนะนำให้พวกเขามีบางอย่างแตกต่างกัน พวกเขามีขอบเขตศัพท์ คุณไม่สามารถผูกสิ่งนี้ที่ไม่มีอยู่ นั่นเป็นเหตุผลที่.bind, .callฯลฯ ไม่ได้ทำงานกับมัน
atoth

1
นั่นเป็นความจริง - และสิทธิ์ของคุณนั้นแม่นยำยิ่งขึ้น ขอบคุณ
chriskelly

1
ฉันจะบอกว่านี่คือเหตุผลที่คุณควรใช้ลูกศรไขมันเฉพาะเมื่อคุณต้องการ แต่ฉันไม่ได้ติดตามว่าthisมันคืออะไร
xdumaine

42

หากคุณกำลังใช้ใน NodeJS คุณสามารถตั้งค่าการหมดเวลาใน package.json

"test": "mocha --timeout 10000"

จากนั้นคุณสามารถเรียกใช้โดยใช้ NPM เช่น:

npm test

1
สำหรับกรณีทดสอบทั้งหมดไม่ใช่กรณีทดสอบเดียว
อ่าน

ตกลงว่านี่ไม่ตอบคำถาม แต่ก็เพียงพอสำหรับกรณีการใช้งานของฉันที่ฉันไม่สนใจว่ามันเพิ่มขึ้นสำหรับการทดสอบทั้งหมด ฉันคิดว่าผู้คนจำนวนมากที่จบลงที่นี่อาจไม่สนใจว่าจะเป็นการทดสอบครั้งเดียวหรือทั้งหมดดังนั้นฉันขอขอบคุณคำตอบที่ได้รับที่นี่
billoverton

22

จากบรรทัดคำสั่ง:

mocha -t 100000 test.js

14
สิ่งนี้จะเพิ่มการหมดเวลาสำหรับกรณีทดสอบทั้งหมดแทนที่จะเป็น "สำหรับกรณีทดสอบเฉพาะ" เช่นคำถามที่ถาม
Louis

16

คุณอาจคิดถึงวิธีอื่นและเปลี่ยนการเรียกไปยังทรัพยากรเครือข่ายด้วยออบเจกต์ stub หรือ mock ด้วยการใช้Sinonคุณสามารถแยกแอปออกจากบริการเครือข่ายโดยมุ่งเน้นการพัฒนาของคุณ


7
มันไม่เกี่ยวข้องทั้งหมด ; บ่อยครั้งมันทำให้รู้สึกไม่เหมาะที่จะตอบสนองเครือข่ายดังนั้นคุณจึงไม่เชื่อใจในเครื่องนั้นว่ากำลังทำงานหรือกำลังตอบสนองที่ถูกต้อง อย่างไรก็ตามถ้าคุณกำลังทดสอบการตอบสนองด้วยตัวเองใช่แล้วคุณยังต้องทำ
aendrew

2
ฉันใช้ sinon / mocha เพื่อสร้างการทดสอบการรวมระบบดังนั้นการหมดเวลาที่สูงขึ้นจึงมีความเกี่ยวข้อง
jcollum

9

สำหรับการทดสอบ 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)จะหลีกเลี่ยงมากกว่าที่ใช้ตลอดเวลา


2

สิ่งนี้ได้ผลสำหรับฉัน! ไม่พบสิ่งใดที่จะทำให้มันทำงานกับก่อน ()

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 () ทำงานได้อย่างสมบูรณ์แบบ!
acidjazz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.