मोचा में एकल परीक्षण मामले के लिए टाइमआउट कैसे बढ़ाया जाए


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

तीर फ़ंक्शन उपयोग के लिए निम्नानुसार है:

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

23
मध्यांतर मिलीसेकंड में है, और यह 2000 की चूक है।
एथान मिक

47
मैं es6 एरो फ़ंक्शंस का उपयोग कर रहा था और काम करने के लिए "इस" के लिए पुरानी 'फ़ंक्शन' परिभाषाओं पर वापस आना पड़ा।
अरुणा हेराथ

1
हुक के लिए भी काम करता है, जैसेbefore(function(done){this.timeout(5 * 1000);...});
JP

2
@ एए का कारण यह नहीं है कि एरो फंक्शन काम नहीं करता है क्योंकि यह शाब्दिक है
टान्नर फॉल्कनर

11
वहाँ एक तरीका यह तीर समारोह के साथ काम करने के लिए है? संपादित करें: ऐड .timeout(500)के अंत तकit(...).timeout(500)
chovy

136

यदि आप es6 एरो फ़ंक्शंस का उपयोग करना चाहते हैं, तो आप .timeout(ms)अपनी itपरिभाषा के अंत में जोड़ सकते हैं :

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

कम से कम यह टाइपस्क्रिप्ट में काम करता है।


3
यह काम करता है, लेकिन .timeoutमोचा के लिए निश्चित रूप से टाइप किए गए टाइपिंग में शामिल नहीं है: i.imgur.com/jQbWCn1.png - एक नियमित रूप से पुराने फ़ंक्शन के साथ this.timeout(2000)या this.slow(500)त्रुटियों के बिना काम करता है
लियोन एडलर

3
अफसोस की बात है, यह केवल के लिए काम करता है it, यह काम नहीं करता है describe
रॉब्रिक

3
वहाँ के लिए यह करने के लिए एक रास्ता है describe()या context()?
चॉवी

1
@LeonAdler .timeoutअब निश्चित रूप से Typed के Mocha टाइपिंग में शामिल है Mocha.IRunnable:। हालाँकि, अगर आप इन परीक्षणों को चलाने के लिए वेबस्टॉर्म आईडीई का उपयोग कर रहे हैं, तो सावधानी का एक नोट: जो भी कारण हो, वेबस्टॉर्म के मोचा एकीकरण प्लगइन अभी भी मोचा परीक्षणों को .timeout()संलग्न के साथ मान्यता नहीं देता है (जिसका अर्थ है कि कोई 'रन' बटन उनके बगल में प्रकट नहीं होता है), और इस प्रकार मैं this.timeout()इसके उपयोग की अनुमति देने के लिए तीर के कार्यों से बचने की वकालत करता हूं ।
जेमी बिर्च

यह पूर्ण है। Async फ़ंक्शन के लिए एक वादे को पूरा करना जिसे आप पूरा कर सकते हैं ()।
बिलवरटन

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 टिप्पणी में उल्लेख के रूप में, वसा तीर कार्यों के लिए अपने स्वयं की जरूरत नहीं है इस बंधन। इसलिए, यह संभव नहीं है कि यह करने के लिए बाँध करने के लिए कार्य इस कॉलबैक की और एक प्रदान टाइमआउट कार्य करते हैं।

नीचे पंक्ति : ऐसे कार्यों के लिए एरो फ़ंक्शंस का उपयोग न करें जिन्हें एक बढ़ी हुई समय की आवश्यकता है।


2
क्योंकि एरो फ़ंक्शंस में ऐसा बिल्कुल नहीं होता है। यहाँ और पढ़ें: blog.getify.com/arrow-this
atoth

2
हां लेकिन मैंने जवाब में यह समझाया है। मेरी टिप्पणी देखें // कोड के अंदर। मुझे शायद इसे स्पष्ट करने के लिए कोड ब्लॉक के बाहर समझाना चाहिए। यह मौजूद नहीं है लेकिन यह बाहरी दायरे से आता है।
क्रिसिस्ली

1
मेरी व्याख्या अधिक सटीक है। thisतीर के कार्यों में कोई बंधन नहीं है - उसी तरह से यह नहीं सुझाएगा कि उनके पास किसी तरह का है, बस अलग है। उनके पास केवल लेक्सिकल स्कोप हैं। आप इसे गैर-मौजूदा नहीं बांध सकते। इसीलिए .bind, .callआदि इसके साथ काम नहीं करते हैं।
atoth

1
यह सच है - और आपका अधिकार अधिक सटीक है। धन्यवाद
१२:०६ पर क्रिसीली

1
मैं कहूंगा कि यही कारण है कि आपको केवल वसा तीर का उपयोग करना चाहिए जब आपको उनकी आवश्यकता होती है, लेकिन मैंने जो कुछ किया है उसका ट्रैक खो दिया thisहै।
xdumaine

42

यदि आप NodeJS में उपयोग कर रहे हैं तो आप package.json में टाइमआउट सेट कर सकते हैं

"test": "mocha --timeout 10000"

तो आप npm का उपयोग करके चला सकते हैं जैसे:

npm test

1
यही कारण है कि सभी परीक्षण मामलों के लिए, एक भी परीक्षण मामला नहीं है
8:19

सहमत हैं कि यह सवाल का जवाब नहीं देता है, लेकिन यह मेरे उपयोग के मामले के लिए पर्याप्त था जहां मुझे परवाह नहीं थी अगर यह सभी परीक्षणों के लिए बढ़ गया। मुझे लगता है कि बहुत से लोग जो यहां समाप्त होते हैं, अगर यह एक परीक्षण या सभी के लिए परवाह नहीं है, तो मैं इस जवाब की सराहना करता हूं।
बिलवरटन

22

कमांड लाइन से:

mocha -t 100000 test.js

14
यह प्रश्न पूछने की तरह "किसी विशेष परीक्षण मामले के लिए" के बजाय सभी परीक्षण मामलों के लिए समय सीमा बढ़ाता है ।
लुई

16

आप एक अलग दृष्टिकोण लेने के बारे में भी सोच सकते हैं और कॉल को नेटवर्क संसाधन में स्टब या मॉक ऑब्जेक्ट से बदल सकते हैं। सिनॉन का उपयोग करते हुए , आप अपने विकास के प्रयासों पर ध्यान केंद्रित करते हुए, नेटवर्क सेवा से ऐप को डिकॉप्ल कर सकते हैं।


7
यह पूरी तरह से अप्रासंगिक नहीं है ; बार-बार, यह नेटवर्क प्रतिक्रिया को स्टब करने के लिए समझ में आता है ताकि आप उस मशीन पर निर्भर न हों या सही प्रतिक्रिया दे रहे हों। यदि आप स्वयं ही प्रतिक्रिया का परीक्षण कर रहे हैं, तो हाँ, आपको अभी भी इसे करने की आवश्यकता है।
aendrew

2
मैं कुछ एकीकरण परीक्षणों के निर्माण के लिए सिनॉन / मोचा का उपयोग कर रहा हूं, इसलिए उच्च समय-समय प्रासंगिक हैं।
जौलम

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

.time () पूरी तरह से काम किया!
acidjazz 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.