2009-12-10 14 views
7

क्या myInnerFunction नीचे परीक्षण करना संभव है?अज्ञात कार्यों के अंदर जावास्क्रिप्ट कार्यों का परीक्षण

var val = function() { 
    var myInnerfunction = function(input) { 
     return input + ' I ADDED THIS'; 
    }; 
    return myInnerfunction('test value'); 
}(); 

क्योंकि myInnerFunction अनिवार्य रूप से गुमनाम रूप से निष्पादित बाहरी समारोह के एक निजी सदस्य है, ऐसा प्रतीत नहीं होता है जैसे कि यह बाहर से परीक्षण योग्य है।

+1

उत्तर अब एक व्यापक प्रश्न उठा रहे हैं। यह एक मामूली उदाहरण था। मेरे पास जेएस फ़ंक्शंस हैं जो अपेक्षाकृत डीओएम संरचना के साथ निकटता से बंधे हैं, जिन्हें वे इसके साथ जोड़ते हैं, और इसे सामान्य सार्वजनिक उपयोगिता API में नहीं खींचा जा सकता है। मुझे इन कार्यों का परीक्षण करने की ज़रूरत है; उनका तर्क महत्वपूर्ण है, लेकिन वे सभी को एक समारोह शाब्दिक के भीतर-डीओएम-तैयार घोषित किया गया है, और घटना संचालक के रूप में डीओएम तत्वों के रूप में संलग्न किया गया है। वे अनिवार्य रूप से निजी हैं, और डीओएम संरचना के साथ निकटता से जुड़े हुए हैं, लेकिन मुझे अभी भी उनका परीक्षण करने की आवश्यकता है। मेरे परीक्षणों से मुझे उनके पास पहुंचने के लिए वे कहां रहना चाहिए? –

+0

विधियों को लेने के लिए मैं लाइब्रेरी द्वारा-dom-ready पर निष्पादित अज्ञात फ़ंक्शन से परीक्षण करना चाहता हूं, मैंने उन्हें "पैकेज" के भीतर नामित किया जो मेरे पृष्ठ पर चल रही कार्यक्षमता के अनुरूप है। यद्यपि यह कोड वास्तव में केवल इस विशेष पृष्ठ पर उपयोग किया जाएगा, और केवल ईवेंट हैंडलर के माध्यम से मैंने इस विशिष्ट डोम में जोड़ा है, कम से कम मैं अब इस तर्क का परीक्षण कर सकता हूं। मुझे निर्देशित करने के लिए आप सभी को धन्यवाद। कोई और विचार स्वागत है। –

उत्तर

1

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

तो ऑन-डोम-तैयार पर निष्पादित अज्ञात फ़ंक्शन के भीतर, मैं बस अपने पूर्व-परिभाषित कार्यों को ईवेंट हैंडलर के रूप में उचित डोम हुक में संलग्न करता हूं। अपने स्वयं के कार्यों को, मेरे खुले उपयोगिताओं के कार्यों के साथ संग्रहीत नहीं किया जाता है, फिर भी डीओएम संरचना से जुड़े मेरे नामस्थान में एक पैकेज के भीतर सार्वजनिक रूप से संग्रहीत किया जाता है। इस तरह मैं उन पर जा सकता हूं और उन्हें उचित रूप से परीक्षण कर सकता हूं।

1

afaik इकाई परीक्षण आपके द्वारा परीक्षण की जाने वाली चीज़ों के आंतरिक कार्यों के बारे में चिंता नहीं करता है। मुद्दा यह है कि आप कार्यक्षमता का परीक्षण करते हैं यानी: क्या ऐसा करने वाला है, यह नहीं कि यह कैसे करता है। तो यदि यह एक आंतरिक निजी सदस्य का उपयोग करता है, तो परीक्षण योग्य नहीं होना चाहिए ...

1

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

निजी विधि का परीक्षण करने का प्रयास करने से आपके कोड को बदलने और प्रतिक्रिया करने में कठिनाई होगी, भले ही बाहरी व्यवहार संरक्षित हो। उस ने कहा, मैं यूनिट परीक्षणों को अपने कोड के व्यापक परीक्षण के रूप में देखना पसंद नहीं करता, बल्कि केवल एपीआई का एक उदाहरण प्रदान करता हूं और यह विभिन्न स्थितियों से कैसे व्यवहार करता है। अब

var val = function() { 
    var myInnerfunction = function(input) { 
     return input + ' I ADDED THIS'; 
    }; 
    /* START test hook */ 
    arguments.callee.__test_inner = myInnerFunction; 
    /* END test hook */ 
    return myInnerfunction('test value'); 
}(); 

, एक बार वैल में कम से कम एक बार चलाया जा रहा है, तो आप संदर्भित कर सकते हैं val.__test_inner और परीक्षण योग्य जानकारी के साथ यह फोन:;)

5

आप जानबूझकर एक परीक्षण हुक बाहर की दुनिया के, को प्रकट कर सके संभवतः इस तरह ।

इस दृष्टिकोण को लाभ: 1. तुम क्या उजागर किया है और नहीं है चुनें (यह भी एक नकारात्मक 'आपको ऐसा करने की याद कारण) 2. सब आपको मिल निजी विधि करने के लिए एक प्रति-संदर्भ है, इसलिए आप इसे गलती से बदल नहीं सकते हैं, केवल इसका उपयोग करें और देखें कि यह

दोष: 1. यदि निजी सदस्य अपने होस्ट/पैरेंट फ़ंक्शन की स्थिति बदलता है (या निर्भर करता है), तो आपके लिए यह कठिन है इसके आस-पास यूनिट परीक्षण, क्योंकि आपको एक ही समय में मेजबान/अभिभावक राज्य को फिर से बनाना या कृत्रिम रूप से नियंत्रित करना है 2. जैसा कि बताया गया है, इन हुकों को मैन्युअल रूप से

जोड़ना होगा

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

+0

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

+0

यही कारण है कि मैंने उपरोक्त की तरह स्वरूपित टिप्पणियों के ब्लॉक को बिल्ड-प्रोसेस स्ट्रिप का सुझाव दिया है। –

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