मूलांक परीक्षण में अतुल्यकालिक फ़ंक्शन को कॉल करते समय टाइमआउट से कैसे बचें त्रुटि: 2000 मी का समय पार हो गया


200

अपने नोड एप्लिकेशन में मैं अपने कोड का परीक्षण करने के लिए मोचा का उपयोग कर रहा हूं। मोचा का उपयोग करते हुए कई अतुल्यकालिक कार्यों को कॉल करते समय, मुझे टाइमआउट त्रुटि ( Error: timeout of 2000ms exceeded.) मिल रही है । मैं इसे कैसे हल करूं?

var module = require('../lib/myModule');
var should = require('chai').should();

describe('Testing Module', function() {

    it('Save Data', function(done) {

        this.timeout(15000);

        var data = {
            a: 'aa',
            b: 'bb'
        };

        module.save(data, function(err, res) {
            should.not.exist(err);
            done();
        });

    });


    it('Get Data By Id', function(done) {

        var id = "28ca9";

        module.get(id, function(err, res) {

            console.log(res);
            should.not.exist(err);
            done();
        });

    });

});

क्या यह एकीकरण परीक्षण है? परीक्षण को चलाने के लिए बहुत समय है - शायद आपको स्टब्स पर विचार करना चाहिए - github.com/thlorenz/proxyquire आपको मदद कर सकता है।

@surui धन्यवाद मैं पर दिखेगा कि
सचिन

क्या मैं अतुल्यकालिक सामान के लिए वादों का उपयोग करने की सिफारिश कर सकता हूं और यह परीक्षण कर रहा हूं कि चाई के साथ वादे के अनुसार
क्रिम्म

जवाबों:


344

अपना परीक्षण चलाते समय आप या तो टाइमआउट सेट कर सकते हैं:

mocha --timeout 15000

या आप प्रत्येक सूट या प्रत्येक प्रोग्राम के लिए समय-समय पर प्रोग्राम सेट कर सकते हैं:

describe('...', function(){
  this.timeout(15000);

  it('...', function(done){
    this.timeout(15000);
    setTimeout(done, 15000);
  });
});

अधिक जानकारी के लिए डॉक्स देखें ।


3
कम संस्करण है -t। यदि आप ग्रन्थ कार्य से मोचा चलाने के लिए मोचा-परीक्षण का उपयोग करते हैं, तो यह विकल्प ऑब्जेक्ट में भी समर्थित है options:{timeout:15000}
svassr

5
FYI करें: मोचा को तीर फ़ंक्शन पास करना हतोत्साहित करता है। mochajs.org/#arrow-functions
c0ming

4
ऊपर दिए गए लिंक में एरो फ़ंक्शंस को हतोत्साहित नहीं किया गया है। यह सिर्फ यह कहता है कि आपको यह जानने की जरूरत है कि वे क्या करते हैं ताकि आप संदर्भ तक पहुंचने की आवश्यकता के समय खराब न हों। मुझे कभी भी संदर्भ की आवश्यकता नहीं होती है, क्योंकि टाइमआउट पर भरोसा करना नाजुक होता है, और मेरे सभी परीक्षण कुछ एमएस में चलते हैं, लेकिन मैं एक ही मुद्दे पर आता है जब साइनॉन-टेस्ट का उपयोग करते हैं। अभी भी समय के 99% lambdas का उपयोग करें।
ऑलिगॉफ्रेन

26
TypeError: this.timeout is not a functionउपयोग करते समय"mocha": "^3.5.0"
जूनियर मेहे

5
@adi क्या आप सुनिश्चित हैं कि आप तीर फ़ंक्शन का उपयोग नहीं कर रहे हैं? Async / प्रतीक्षा के संबंध में यह डॉक्स में काम करना चाहिए (और वादों का उपयोग करने के समान ही है)। एक और सवाल की तरह लगता है।
एंड्रियास हॉल्टग्रेन 19

80

मुझे पता है कि सिर्फ टाइमआउट बढ़ाने का "समाधान" यह बताता है कि यहां वास्तव में क्या हो रहा है, जो कि या तो है

  1. आपका कोड और / या नेटवर्क कॉल बहुत धीमी गति से होते हैं (एक अच्छे उपयोगकर्ता अनुभव के लिए उप 100 ms होना चाहिए)
  2. मुखर (परीक्षण) विफल हो रहे हैं और मोचा उन पर कार्रवाई करने में सक्षम होने से पहले त्रुटियों को निगल रहा है।

आप आमतौर पर # 2 का सामना करते हैं जब मोचा को कॉलबैक से जोरदार त्रुटियाँ नहीं मिलती हैं। यह कुछ अन्य कोड के कारण होता है जो स्टैक को छोड़कर अपवाद को निगलता है। इससे निपटने का सही तरीका कोड को ठीक करना है और त्रुटि को निगलना नहीं है

जब बाहरी कोड आपकी त्रुटियों को निगल जाता है

यदि यह एक लाइब्रेरी फ़ंक्शन है जिसे आप संशोधित करने में असमर्थ हैं, तो आपको दावे को पकड़ने और इसे स्वयं मोचा पर पास करने की आवश्यकता है। आप एक कोशिश / कैच ब्लॉक में अपने जोर कॉलबैक को लपेटकर ऐसा करते हैं और किसी भी अपवाद को हैंडलर को पास करते हैं।

it('should not fail', function (done) { // Pass reference here!

  i_swallow_errors(function (err, result) {
    try { // boilerplate to be able to get the assert failures
      assert.ok(true);
      assert.equal(result, 'bar');
      done();
    } catch (error) {
      done(error);
    }
  });
});

इस बायलरप्लेट को निश्चित रूप से कुछ उपयोगिता समारोह में निकाला जा सकता है ताकि परीक्षण आंख को थोड़ा और प्रसन्न कर सके:

it('should not fail', function (done) { // Pass reference here!
    i_swallow_errors(handleError(done, function (err, result) {
        assert.equal(result, 'bar');
    }));
});

// reusable boilerplate to be able to get the assert failures
function handleError(done, fn) {
    try { 
        fn();
        done();
    } catch (error) {
        done(error);
    }
}

नेटवर्क परीक्षणों को गति देना

इसके अलावा, मेरा सुझाव है कि आप एक कामकाजी नेटवर्क पर भरोसा किए बिना परीक्षण पास बनाने के लिए नेटवर्क कॉल के लिए टेस्ट स्टब्स का उपयोग शुरू करने के बारे में सलाह लें। मोचा, चाय और सिनॉन के प्रयोग से परीक्षण कुछ इस तरह दिख सकते हैं

describe('api tests normally involving network calls', function() {

    beforeEach: function () {
        this.xhr = sinon.useFakeXMLHttpRequest();
        var requests = this.requests = [];

        this.xhr.onCreate = function (xhr) {
            requests.push(xhr);
        };
    },

    afterEach: function () {
        this.xhr.restore();
    }


    it("should fetch comments from server", function () {
        var callback = sinon.spy();
        myLib.getCommentsFor("/some/article", callback);
        assertEquals(1, this.requests.length);

        this.requests[0].respond(200, { "Content-Type": "application/json" },
                                 '[{ "id": 12, "comment": "Hey there" }]');
        expect(callback.calledWith([{ id: 12, comment: "Hey there" }])).to.be.true;
    });

});

अधिक जानकारी के लिए सिनोन के niseडॉक्स देखें ।


मेरे पास परीक्षणों का एक बड़ा सूट है और मैं बस अपने चश्मे में सभी वादों के माध्यम से चला गया यह सुनिश्चित करने के लिए कि वे सभी done()वादे के अंत में बुला रहे हैं और मैं पहले से ही कोणीय के उपयोग से नेटवर्क कॉल का मजाक उड़ा रहा हूं $httpBackend, लेकिन कोई भाग्य नहीं। कोशिश के साथ हर एक युक्ति को पकड़ना बहुत व्यावहारिक नहीं लगता है। कोई अन्य सुझाव? धन्यवाद!
गुस्तावो मटियास

@GustavoMatias आपने वास्तव में आपकी समस्या का उल्लेख नहीं किया है, बस कहा गया है कि यह आपके लिए जो भी समस्याएँ हैं, उनका समाधान नहीं है। कृपया विस्तृत करें :-) क्या आपके परीक्षण पर्याप्त तेज़ी से विफल नहीं हो रहे हैं? क्या वे कई बार असफल हो जाते हैं, लेकिन आप जानना चाहेंगे कि क्यों? अनुमान लगाने में मुश्किल है कि आप क्या हासिल करना चाहते हैं।
ओलिगोफ़्रेन

हाय @oligofren! यह वास्तव में सबसे अच्छा स्पष्टीकरण नहीं था। मेरी समस्या का अधिक विस्तृत विवरण यहां है stackoverflow.com/questions/34510048/… धन्यवाद!
गुस्तावो मतिस

"सामान्य तौर पर, इस समस्या से निपटने का सबसे साफ तरीका (लेकिन सबसे खराब) तरीका यह है कि आप अपने कोड को एक कोशिश / कैच के साथ लपेटें और किए गए हैंडलर को कोई अपवाद पारित करें।" नहीं, यह बिल्कुल साफ तरीके से नहीं है। एक लांग शॉट से नहीं। सबसे साफ तरीका कोड लिखना है जो अपवादों को नहीं निगलता है। हर बार मैंने किसी को शिकायत करते देखा है कि मोचा एक असफल परीक्षण का पता नहीं लगा रहा था, ऐसा इसलिए था क्योंकि अपवाद को निगलने में कुछ था। इसे ठीक करने के बजाय परीक्षण के तहत कोड में बग के चारों ओर एक try.... catch...कार्य जोड़ना ।
लुई

@ आप संभवतः यहां के बारे में सही हो सकते हैं, लेकिन मैं इसे नीले रंग से सत्यापित नहीं कर पा रहा हूं। वैसे भी, लोगों को एक समस्या है मोचा प्रतीत होता है कि कुछ त्रुटि को पकड़ने में असमर्थ है, और यह इसे संभालने का एक तरीका है। आपका दिया गया दृष्टिकोण मानता है कि त्रुटि को निगलने वाला कोड कुछ लाइब्रेरी फ़ंक्शन या समान नहीं है, जिस स्थिति में यह इतनी आसानी से हल नहीं होगा।
ऑलिगॉफ्रेन

7

थोड़ी देर से लेकिन भविष्य में कोई इसका उपयोग कर सकता है ... आप अपने पैकेज में स्क्रिप्ट को अपडेट करके अपना परीक्षा समय बढ़ा सकते हैं। निम्नलिखित के साथ:

"scripts": { "test": "test --timeout 10000" //Adjust to a value you need }

कमांड का उपयोग करके अपने परीक्षण चलाएं test


मेरे लिए काम किया! धन्यवाद!
रेवलवेसी

5

यदि आप तीर फ़ंक्शन का उपयोग कर रहे हैं:

it('should do something', async () => {
  // do your testing
}).timeout(15000)

1

मेरे लिए समस्या वास्तव में वर्णन फ़ंक्शन थी, जो जब एक तीर फ़ंक्शन प्रदान करता है, तो मोचा को टाइमआउट याद करने का कारण बनता है, और लगातार व्यवहार नहीं करता है। (ईएस 6 का उपयोग करके)

चूंकि कोई वादा अस्वीकार नहीं किया गया था इसलिए मुझे यह त्रुटि विभिन्न परीक्षणों के लिए हर समय मिल रही थी जो वर्णन ब्लॉक के अंदर विफल हो रहे थे

तो ठीक से काम नहीं करने पर यह कैसा दिखता है:

describe('test', () => { 
 assert(...)
})

और यह अनाम फ़ंक्शन का उपयोग करके काम करता है

describe('test', function() { 
 assert(...)
})

आशा है कि यह किसी को मदद करता है, ऊपर के लिए मेरा विन्यास: (नोडज: 8.4.0, एनपीएम: 5.3.0, मोचा: 3.3.0)


0

मेरा मुद्दा प्रतिक्रिया वापस नहीं भेज रहा था, इसलिए यह लटका हुआ था। यदि आप एक्सप्रेस का उपयोग कर रहे हैं, तो सुनिश्चित करें कि res.send (डेटा), res.json (डेटा) या आपके द्वारा उपयोग किए जाने वाले एपी विधि को आपके द्वारा परीक्षण किए जा रहे मार्ग के लिए निष्पादित किया गया है।


0

परीक्षण मामलों में उपयोग किए गए वादों को हल करना / अस्वीकार करना सुनिश्चित करें, यह जासूसी या स्टब्स सुनिश्चित करें कि वे हल / अस्वीकार करते हैं।

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