2013-07-26 6 views
7

रोकें मैं एक नोड एपीआई के लिए परीक्षण लिखने के लिए मोचा का उपयोग कर रहा हूं। एक परीक्षण में, मुझे 2 कार्यों को निष्पादित करने और प्रत्येक के टाइमस्टैम्प की तुलना करने की आवश्यकता है और यह सुनिश्चित करना है कि वे अलग हैं। ऐसा करने के लिए, मुझे कम से कम एक सेकंड के लिए परीक्षण निष्पादन को विश्वसनीय रूप से रोकना होगा। पर दूसरे कॉल से पहले मोचा निष्पादन को रोकने के लिए मैं setTimeout का उपयोग करने की कोशिश कर रहा था, लेकिन ऐसा नहीं हो रहा है।सेटटाइमआउट का उपयोग करना() एक मोचा परीक्षण

it('should insert then update the timestamp.', function(done) { 
    Do.ping('arg1', function(err, result) { 
    should.not.exist(err); 

    setTimeout(Do.ping('arg1', function(err, result) { 
     // Test that the timestamp of the first ping is before the timestamp 
     // of the second ping (among other things) 
     done(); 
    }), 1000); 
    }); 
}); 

कोई भी देखता है कि मैंने यहां क्या किया है? वैकल्पिक रूप से, क्या मैं ऐसा करने की कोशिश कर रहा हूं जो करने के लिए एक बेहतर (यानी अधिक मोचा-आश) तरीका है?

उत्तर

2

मैं सिनन के नकली टाइमर एपीआई का उपयोग कर समाप्त हुआ और यह बहुत अच्छा काम कर रहा है। क्रमशः beforeEach() और afterEach() में नकली टाइमर को तत्काल और रीसेट करें।

clock.tick(180000); // Advances the JS clock 3 minutes (180 seconds) 
0

मुझे एक (untested) विकल्प सुझाने दें:

var async = require('async') 
it('should insert then update the timestamp.', function(done) { 
    async.series([ 
    Do.ping('arg1', function(err, result) { 
    should.not.exist(err); 
    }, 
    setTimeout(console.log('waiting'),1000); 
    }, 
    Do.ping('arg2', function(err, result) { 
    should.not.exist(err); 
    }, 
    done();] 
    }); 
}); 

मुझे लगता है कि async.series का उपयोग करके आप अधिक मज़बूती से दूसरी कॉल करने के लिए हो रहा से मोचा को रोकने के लिए कर सकेंगे।

+0

धन्यवाद। मैं जेएस घड़ी में हेरफेर करने के लिए साइनऑन पैकेज को आजमा रहा हूं और अब तक यह बहुत अच्छी तरह से काम कर रहा है। –

0

मैं npm install sleepfor का उपयोग कर sleepfor पैकेज जोड़ दिया है: वास्तविक परीक्षा के भीतर, बस जो कुछ भी तरह से आप की जरूरत है घड़ी अग्रिम। अपने परीक्षण में मैं निम्नलिखित है:

const sleepfor = require('sleepfor'); 

describe('My Test', function() { 
    it('should test something here.', function(){ 
     // Run some test code here. 
    }); 
    it('should test something ELSE here.', function(){ 
     // Run different test code here. 
    }); 

    afterEach(function(){ 
     var d = new Date(); 
     console.log(d.toLocaleString() + " >> Before sleep."); 
     sleepfor(5000); 

     var d = new Date(); 
     console.log(d.toLocaleString() + " >> After sleep."); 
    }); 
}); 

स्पष्ट होना चाहिए, लेकिन सिर्फ मामले में, afterEach अपने यह ब्लॉक फांसी से प्रत्येक के बाद कहा जाता है।

+0

'sleepfor' जैसे कुछ उपयोग करने के बजाय [स्वीकृत उत्तर] (https://stackoverflow.com/a/18000251/1906307) में विधि का उपयोग करना बेहतर है। प्रत्येक परीक्षण * आवश्यक * चलाने के लिए कम से कम 5 सेकंड ले जाएगा। सूट में परीक्षण जोड़ने शुरू करें और जल्द ही आप प्रतीक्षा करने में कुछ मिनट व्यतीत कर रहे हैं। अब, घड़ी में हेरफेर करके एक ही परीक्षण करें, और परीक्षण चलाने के लिए मिलीसेकंड ले जाएगा। इसके अलावा 'sleepfor' वास्तव में "नींद" नहीं करता है: यह आपके द्वारा पूछे जाने वाले अंतराल के दौरान एक लूप चलाता है। तो आपकी प्रक्रिया उस समय के दौरान आपके सीपीयू खाएगी: संसाधनों की बर्बादी! फिर, घड़ी को छेड़छाड़ करने से इस मुद्दे से बचा जाता है। – Louis

+0

हाँ, मैंने सवाल को गलत समझा। मैं इस सवाल से परीक्षण के बीच में रोक/नींद कैसे खोज रहा था। मैं यह भी जोड़ूंगा कि मेरे मामले में मैं अंततः 'browser.pause (...) 'का उपयोग कर समाप्त हुआ। मुझे अच्छी तरह से उपयुक्त, लेकिन @Louis बताते हैं, यह इस सवाल का जवाब नहीं है। –

संबंधित मुद्दे