2013-05-06 11 views
18

मैं जैस्मीन रन का उपयोग करता हूं और एसिंक्रोनस ऑपरेशंस का परीक्षण करने के लिए प्रतीक्षा करता हूं। सबकुछ ठीक काम करता है लेकिन मुझे यकीन नहीं है कि दृश्यों के पीछे क्या चल रहा है।जैस्मीन क्या करता है और इंतजार करता है वास्तव में क्या करता है?

जैस्मीन दस्तावेज़ निम्नलिखित उदाहरण बताता है जिसमें मैंने तीन लॉग स्टेटमेंट जोड़े।

describe("Asynchronous specs", function() { 
    var value, flag; 

    it("should support async execution of test preparation and exepectations", function() { 

    runs(function() { 
     flag = false; 
     value = 0; 

     setTimeout(function() { 
     flag = true; 
     }, 500); 
    }); 

    waitsFor(function() { 
     value++; 
     if(flag) { 
      console.log("A"); 
     } 
     return flag; 
    }, "The Value should be incremented", 750); 

    console.log("B"); 

    runs(function() { 
     console.log("C"); 
     expect(value).toBeGreaterThan(0); 
    }); 
    }); 
}); 

});

पहले runs और waitsFor मेरे लिए बिल्कुल स्पष्ट हैं। Runs एक एसिंक्रोनस ऑपरेशन शुरू करता है और waitsFor एक शर्त के लिए इंतजार कर रहा है।

हालांकि मुझे नहीं पता कि दूसरा runswaitsFor समाप्त होने तक क्यों शुरू नहीं होता है। waitsFor अवरुद्ध कॉल नहीं है।

मेरा अनुमान है कि waitsFor यह पूरा होने तक runs कॉल को निहित रूप से अवरुद्ध करता है। क्या ऐसा है?

मेरे सबूत है कि console.log बयान उत्पादन होता है:

बीएसी

लेकिन अगर waitsFor वास्तव में ब्लॉक कर देगा यह

होना चाहिए एबीसी

उत्तर

17

waitsFor ब्लॉक की स्थिति जब तक यह इंतजार कर रहा है है के लिए मिले हैं या यह समय समाप्त हो गया है।

jasmine docs से: "waitsFor() कुछ अन्य काम पूरा होने तक आपके spec को रोकने के लिए एक बेहतर इंटरफ़ेस प्रदान करता है। जैस्मीन अगले ब्लॉक के साथ जारी रखने से पहले प्रदान किए गए फ़ंक्शन को पूरा होने तक प्रतीक्षा करेगा।"

लिंक किए गए दस्तावेज़ों का थोड़ा स्पष्ट उदाहरण या waitsFor भी है।

संपादित करें: आह मैं देखता हूं कि अब आपका क्या मतलब है। waitsFor जेएस को अवरुद्ध नहीं करेगा जो runs, waitsFor, ect में लिपटे नहीं है।

क्या जैस्मीन काम कर रहा है runs या waitsFor के माध्यम से इसे पास कर रहा है और यदि जैस्मीन वर्तमान में प्रतीक्षा नहीं कर रहा है, तो यह तुरंत कार्य निष्पादित करता है। यदि यह इंतजार कर रहा है, तो यह इसे समाप्त होने तक कॉल नहीं करता है।

यह console.log को रोकता नहीं है क्योंकि यह जैस्मीन को पास कर दिया गया है, इसलिए चमेली इसे सीधे निष्पादित होने से रोक नहीं सकती है।

+0

मुझे पूरा यकीन है कि यह मामला नहीं है। आपने 'waitsFor' और दूसरा 'रन' के बीच एक कथन लगाया है, इसे 'प्रतीक्षा करने के लिए कोड' से पहले निष्पादित किया जाएगा, मैं इसे प्रतिबिंबित करने के लिए अपना प्रश्न अपडेट करूंगा। –

+0

लेकिन प्रलेखन के लिंक के लिए धन्यवाद, मुझे यह नहीं पता था :) –

+0

और फिर धन्यवाद, जवाब दस्तावेज़ों में है, लेकिन जहां आपने इंगित किया है बिल्कुल नहीं :) –

4

समाधान दस्तावेज में है:

एकाधिक रन() एक कल्पना में ब्लॉक क्रमानुसार चलेंगे। (Jasmine Documentation)

2

साइट से: http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=mzNDUVfhFXg

जैस्मीन रन() और आपको उनसे आगे निकल में waitsFor() पद्धतियों कॉल करेंगे।जैसे ही जेएस पार्सर एक प्रतीक्षा के लिए हो जाता है() विधि इसे तब तक मतदान करेगी जब तक कि यह सत्य न हो जाए और केवल तभी यह अगले रन() विधि पर जारी रहेगा।

अनिवार्य रूप से, रन() और waitsFor() फ़ंक्शन उनके प्रदान किए गए कार्यों के साथ एक सरणी बनाते हैं। सरणी को तब जैमीन द्वारा संसाधित किया जाता है जिसमें कार्यों को अनुक्रमिक रूप से बुलाया जाता है। रन() द्वारा पंजीकृत उन कार्यों को वास्तविक कार्य करने की उम्मीद है, जबकि वेट्स द्वारा पंजीकृत() को 'लच' फ़ंक्शंस होने की उम्मीद है और जब तक वे सही नहीं हो जाते हैं या वैकल्पिक पंजीकृत टाइमआउट अवधि समाप्त हो जाती है, तब तक प्रत्येक 10ms पर मतदान (आवंटित) किया जाएगा। यदि टाइमआउट अवधि की अवधि समाप्त हो जाती है तो वैकल्पिक पंजीकृत त्रुटि संदेश का उपयोग करके त्रुटि की सूचना दी जाती है; अन्यथा, प्रक्रिया सरणी में अगले कार्य के साथ जारी है। संभवतः, रनों के भीतर उम्मीदें() एक विफलता रिपोर्ट को भी ट्रिगर कर सकती हैं (और शायद यहां तक ​​कि लच फ़ंक्शन में भी)।

प्रलेखन विशेष रूप से इन असीमित सुविधाओं पर विचार कर रहा है।

+1

जैस्मीन 1.3 इंतजार प्रदान करता है (प्रतीक्षा नहीं) जवाब सही किया जाना चाहिए। – florianb

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