2015-03-05 5 views
7

मैं प्रासंगिक भाग को खोजने के लिए घंटों तक कोड नहीं पढ़ना चाहता हूं, लेकिन मुझे उत्सुकता है कि कैसे जैस्मीन अपनी घड़ी लागू करता है। इसके साथ दिलचस्प बात यह है कि यह सिंक परीक्षण कोड के साथ एसिंक कोड का परीक्षण कर सकता है। AFAIK, वर्तमान node.js के साथ, जो ES5 का समर्थन करता है, यह संभव नहीं है (async फ़ंक्शन ES7 में परिभाषित किए गए हैं)। क्या यह जेएस कोड को एस्ट्रैवर्स जैसे कुछ के साथ पार्स करता है और सिंक से एसिंक टेस्ट बनाता है?कैसे जैस्मीन घड़ी काम करता है?

बस मैं क्या बात कर रहा हूँ का एक उदाहरण:

it("can test async code with sync testing code", function() { 
    jasmine.clock().install(); 

    var i = 0; 
    var asyncIncrease = function() { 
     setTimeout(function() { 
      ++i; 
     }, 1); 
    }; 

    expect(i).toBe(0); 
    asyncIncrease(); 
    expect(i).toBe(0); 
    jasmine.clock().tick(2); 
    expect(i).toBe(1); 

    jasmine.clock().uninstall(); 
}); 

यहाँ expect(i).toBe(1); एक कॉलबैक में होना चाहिए।

उत्तर

10

install() फ़ंक्शन वास्तव में setTimeout को एक नकली फ़ंक्शन के साथ प्रतिस्थापित करता है जो जैस्मीन आपको अधिक नियंत्रण देता है। यह सिंक्रोनस बनाता है, क्योंकि कोई वास्तविक प्रतीक्षा नहीं की जाती है। इसके बजाए, आप इसे tick() फ़ंक्शन के साथ मैन्युअल रूप से आगे ले जाएं, जो सिंक्रोनस भी है।

स्रोत कोड देखें: https://github.com/jasmine/jasmine/blob/ce9600a3f63f68fb75447eb10d62fe07da83d04d/src/core/Clock.js#L21

मान लीजिए आप एक समारोह है कि आंतरिक रूप से 5 घंटे की एक समाप्ति सेट था। जैस्मीन बस setTimeout कॉल को प्रतिस्थापित करता है ताकि जब आप tick() पर कॉल करें तो कॉलबैक कॉल किया जाएगा ताकि आंतरिक काउंटर 5 घंटे के निशान तक पहुंच जाए या उससे अधिक हो। यह काफी आसान है!

+0

तो यह वास्तविक एसिंक कोड द्वारा काम नहीं करेगा, उदाहरण के लिए डीबी कनेक्शन द्वारा? – inf3rno

+2

@ inf3rno AJAX सामान के लिए, आप या तो AJAX कॉल (सर्वर काम मानते हैं) या एकीकरण परीक्षण के लिए नकल करना चाहते हैं, वास्तव में इसे async होने दें। – m59

+0

ठीक है। मैं ईएस 5 के लिए एसिंक फ्रेमवर्क पर काम कर रहा हूं, इसलिए मैंने पूछा। धन्यवाद! :-) – inf3rno

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