2009-12-03 44 views
5

में $ (दस्तावेज़) .ready (function() {}) का आह्वान कैसे करें मुझे अपने यूनिट परीक्षणों में document.ready (function() {}) को आमंत्रित करने की कोशिश करने में कठिनाइयों का सामना करना पड़ रहा है। मान लीजिए मैं अपने जावास्क्रिप्ट फ़ाइल में उनमें से कई है, और उनमें से एक एक नामित समारोह के अंदर बुलाया अर्थातयूनिट परीक्षण

function myFunction() { 
    $(document).ready(function() { 
     //... 
    }); 
} 

कैसे मैं वास्तव में उन्हें अपने इकाई परीक्षण में आह्वान करते तो मैं वास्तव में उन्हें परीक्षण कर सकते हैं? मैं अपने जावास्क्रिप्ट का परीक्षण करने के लिए जेएसटेस्ट ड्रायवर का उपयोग कर रहा हूं।

धन्यवाद।

उत्तर

0

इस प्रश्न के उत्तर का हिस्सा here पाया जा सकता है।

myFunction(); 
$.readyList[1](); 

सूचकांक मान लिया गया है कि वहाँ स्रोत फ़ाइल में केवल 1 document.ready समारोह:

नीचे इस सवाल इसके बाद के संस्करण उत्तर के आधार पर जवाब देने के लिए नमूना कोड है। इंडेक्स 0 किसी और चीज को संदर्भित करता है जो मुझे विश्वास है कि ब्राउजर पर जानकारी है।

5

आप जानते हैं document.ready... काम करता है तो बस इसके भीतर कार्यों को कॉल करने के साथ शुरू करें। आदर्श रूप में, यदि आपके पास तैयार फ़ंक्शन द्वारा कॉल किया गया init फ़ंक्शन है तो आप एक फ़ंक्शन को कॉल करते हैं, यह आपको वही करता है, और आप अपने परीक्षणों को जारी रख सकते हैं।

+0

मैं सहमत हूं कि मैं इसे कैसे करता हूं लेकिन अधिकांश लोगों को शायद इनिट फ़ंक्शन की आवश्यकता नहीं होती है। –

0

मैं आपको कोड को दोबारा करने का सुझाव देता हूं। भले ही आपको इसे कॉल करने का कोई तरीका मिल जाए, फिर भी अन्य डेवलपर्स के लिए समझना मुश्किल होगा।

इसके अलावा (आईएमएचओ, मुझे पूरा यकीन नहीं है) पेज तैयार होने की घटना के बाद भी आपको तैयार हैंडलर को कॉल करना होगा, क्योंकि अगर आप तैयार() हैंडलर "इंस्टॉल" करते हैं, तो दस्तावेज़। पहले से ही ईवेंट पहले से ही था ट्रिगर, jquery तुरंत हैंडलर को कॉल करता है (इसलिए यह उस घटना को कभी भी खो देता है, भले ही आपका कोड बहुत देर से एक हैंडलर जोड़ता हो - यानी, दस्तावेज़ के बाद रास्ता। पहले से ही किया गया था)।

क्या आप सिर्फ उपयोगकर्ता my_on_read() ईवेंट नहीं बना सकते? या कुछ ऐसा है?

खैर, अंत में, बस तैयार की देखभाल() की घटनाओं और संचालकों कि document.ready (के बाद स्थापित किया जाएगा) पहले से ही किया जाता है :)

+0

डिजाइन के बारे में दो बार सोचने के लिए एक और विवरण: क्या आप वास्तव में हमेशा पुन: उत्पन्न कर सकते हैं जब एक हैंडलर का "जोड़ना" होता है? इस उदाहरण में इसका मतलब है, "मेरा कार्य" हमेशा इस या उस पृष्ठ पर बुलाया जाएगा? आप (या किसी अन्य डेवलपर) को _interprete_ करना है कि यह फ़ंक्शन एक तैयार हैंडलर स्थापित करेगा - स्पष्ट नहीं! मुझे "अन्य से अधिक वैश्विक" कोड में तैयार हैंडलर जोड़ने में कोई मूल्य नहीं दिखता .. ठीक है, वैश्विक कोड में तैयार हैंडलर _add_ और अपने वैश्विक कोड को केंद्रीय स्थान पर ले जाएं। मुझे यकीन है, यह आपको अप्रचलित प्रश्न देगा। ऐसा लगता है कि आपको ऐप में एक प्रमुख डिज़ाइन दोष मिला है ... – Frunsi

6

यदि यह एक इकाई परीक्षण है, मैं कर रहा हूँ ले कृपया कुछ इनपुट दिए जाने पर आप फ़ंक्शन आउटपुट की जांच कर रहे हैं?

यहाँ मेरी राय है:

आप इस मामले में जहां document.ready कहा जाता है और इस मामले में जहां यह नहीं है के लिए तैयार करना चाहिए।

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

संपादित करें: बस प्रश्न को दोबारा पढ़ें और इसे थोड़ा और समझ लिया। आप केवल $ (दस्तावेज़) को ओवरराइड कर सकते हैं। जो भी आप चाहते हैं उसे करने के लिए पहले से ही (जो DOMLoaded ईवेंट को आग लगाना है, लेकिन इसके बजाय फ़ंक्शंस को तुरंत चलाने के लिए नहीं है)। यह स्निपेट उस फ़ंक्शन के साथ $ (दस्तावेज़) .ready फ़ंक्शन को प्रतिस्थापित करेगा जो ठीक उसी तरह करता है। इसे किसी यूनिट परीक्षण से पहले चलाना चाहिए।

var postReady = true; // or false to ignore the function calls. 
jQuery.fn.ready = function(fn) 
{ 
    if(postReady && fn) fn(); 
} 

उदाहरण परीक्षण का मामला:

<html><head><title>whatever</title> 
    <script type="text/javascript" src="/JS/jquery-1.3.2.js"></script> 

    <script type="text/javascript"> 
     var postReady = true; // or false to ignore the function calls. 
     jQuery.fn.ready = function(fn) 
     { 
      alert("We stole ready!"); 
      if(postReady && fn) fn(); 
     } 

     $(document).ready(function() 
     { 
      alert("The function is called."); 
     }); 
    </script> 
</head><body></body> 
</html> 
+0

@ एडम ए: धन्यवाद। मैंने कुछ ऐसा करने की कोशिश की लेकिन उसे कोई सफलता नहीं मिली। मैं दस्तावेज साबित करने की कोशिश नहीं कर रहा हूं। पहले से काम करता है या नहीं, बल्कि इसके अंदर कोड। मुझे बस अपने यूनिट टेस्ट से इसे आमंत्रित करने का प्रयास करने में बहुत कठिन समय है। मैं जेएसटेस्ट ड्रायवर का उपयोग कर रहा हूं, और ऐसा लगता है कि मैं इसे किसी नामित फ़ंक्शन के तहत रखता हूं या नहीं, इस पर ध्यान दिए बिना किसी दस्तावेज़ को लोड करना प्रतीत होता है। मैंने इसे देरी करने की कोशिश की, window.onload, just_call_it, आदि ... लेकिन यह सिर्फ प्रतिक्रिया नहीं दे रहा है। – BeraCim

+0

मैंने कोड स्निपेट को आजमाया, और ऐसा लगता है कि यह काम करता है। यह क्या करता है jQuery के दस्तावेज़ को ओवरराइड करता है। पहले से ही फ़ंक्शन, चूंकि DOMLoaded ईवेंट आपके यूनिट परीक्षण में नहीं आ जाएगा, जिसका अर्थ है दस्तावेज़। पहले कभी नहीं चलाएगा। स्निपेट दस्तावेज़ बनाता है। DOMLoaded ईवेंट से पहले से ही स्वतंत्र है। यदि हम एक पोस्ट-डीओएमएल लोडेड स्थिति में हैं (जैसा कि पोस्टरेडी चर द्वारा निर्धारित किया गया है) तो तुरंत उस कार्य को कॉल करें जो document.ready को पास किया गया था। यदि हम प्री-डीओएमएलोडेड स्थिति में हैं, तो बस दस्तावेज़ों के किसी भी फ़ंक्शन को अनदेखा करें। पहले से ही कहा जाता है (और सुनिश्चित करें कि फ़ंक्शन अभी भी आवश्यक है)। –

+0

@ एडम ए: मैंने सटीक कोड स्निपेट के साथ चलने की कोशिश की, अलगाव में परीक्षण चलाया, साथ ही केवल 1 दस्तावेज़ छोड़ दिया। मेरे कोड में पहले से ही फ़ंक्शन (मेरे पास उनमें से कई हैं)। दुर्भाग्य से कुछ भी नहीं हुआ (मुझे पहली पंक्ति पर सतर्क था और यह बिल्कुल भी पॉप नहीं हुआ)। मैं यह नहीं समझ सकता कि मैं क्या खो रहा हूं या क्या गलत है। – BeraCim

5

आप इकाई परीक्षण बहुत दूर ले जा सकते हैं, इस मामले में आप अपने आप को पूछने के लिए आप क्या परीक्षण कर रहे हैं, और क्यों की जरूरत है। JQuery document.ready फ़ंक्शन काम करता है, और अच्छी तरह से काम करता है (आप इसे जानते हैं क्योंकि यह कई लोगों द्वारा परीक्षण किया गया है)।

मुझे लगता है कि चाल एक अज्ञात फ़ंक्शन बनाने, नामकरण करने और इसका उपयोग करने के बजाय होगी।

//So instead of this... 
$(document).ready(function() {...}); 

//Do the following 
$(document).ready(my_function); 

फिर आप बस मेरे_फंक्शन का परीक्षण करें और सुनिश्चित करें कि यह काम कर रहा है। सुनिश्चित करें कि आप सटीक परीक्षण के लिए लोड होने वाले क्रम में फ़ंक्शंस का परीक्षण करें।

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