2009-07-08 24 views
61

में निजी विधियों का यूनिट परीक्षण मैं खिलौना परियोजना में परीक्षण संचालित विकास की कोशिश कर रहा हूं। मैं अपने वर्गों में सार्वजनिक इंटरफेस के लिए काम कर रहे परीक्षण प्राप्त कर सकता हूं (हालांकि मैं अभी भी बाड़ पर हूं क्योंकि मैं परीक्षण किए जा रहे तरीकों की तुलना में अधिक परीक्षण कोड लिख रहा हूं)।एक्सकोड

मैं क्योंकि मैं सार्वजनिक इंटरफेस को साफ रखने के लिए करना चाहते निजी तरीकों का एक बहुत का उपयोग करते हैं; हालांकि, मैं अभी भी इन तरीकों पर परीक्षण का उपयोग करना चाहता हूं।

के बाद से कोको एक गतिशील भाषा है, मैं अभी भी इन निजी तरीकों कॉल कर सकते हैं, लेकिन मैं अपने परीक्षण है कि मेरी कक्षा इन तरीकों का जवाब नहीं हो सकता है में चेतावनी मिल (हालांकि यह स्पष्ट रूप से करता है)। चूंकि मैं यहां कोई चेतावनियों के साथ संकलित करना पसंद नहीं करता हूं, मेरे प्रश्न हैं:

  1. मैं इन चेतावनियों को एक्सकोड में कैसे बंद कर सकता हूं?
  2. क्या इन चेतावनियों को बंद करने के लिए मैं कुछ और कर सकता हूं?
  3. क्या मैं 'व्हाइट बॉक्स' परीक्षण करने में कुछ गलत कर रहा हूं?
+0

अभी तक मैंने हेडर फ़ाइल में अपने निजी तरीकों का खुलासा नहीं किया है। मुझे हेडर में केवल सार्वजनिक तरीकों के लिए मुझे और अधिक सुरुचिपूर्ण क्यों होना चाहिए। हालांकि ऐसा लगता है कि मुझे इसे उद्देश्य-सी में बदलना है। – Nils

+1

@Nils आपके पास हेडर फ़ाइल में निजी विधियां नहीं हैं। एक बार वहां, वे सार्वजनिक तरीके हैं। – Abizern

+0

हां @ एबिज़र्न अब तक मैंने पीटर होसे की सलाह का पालन किया है। – Nils

उत्तर

88

कैसे मैं Xcode में इन चेतावनियों को बंद करते हैं?

मत करो।

क्या इन चेतावनियों को बंद करने के लिए मैं कुछ और कर सकता हूं?

मत करो।

क्या मैं 'व्हाइट बॉक्स' परीक्षण करने में कुछ गलत कर रहा हूं?

सं

समाधान अपने स्वयं के शीर्षक में एक वर्ग के लिए अपने निजी तरीकों स्थानांतरित करने के लिए है। इस शीर्षलेख को वास्तविक वर्ग और परीक्षण-केस वर्ग कार्यान्वयन फ़ाइलों दोनों में आयात करें।

+4

+1 - बढ़िया सुझाव!थोड़ी और जानकारी के लिए, इस प्रश्न/उत्तर को देखें: http://stackoverflow.com/questions/1020070/#1020330 निजी विधियों वाले श्रेणी वाले निजी शीर्षलेख को MyClass_Private.h नाम दिया जा सकता है, उदाहरण के लिए। –

+2

इस उत्तर के लिए धन्यवाद। मुझे अभी भी इसके बारे में निश्चित नहीं है, लेकिन मुझे यह स्वीकार करना होगा कि एक परीक्षा लिखने का एक 'मजेदार' तत्व है और फिर इसे पास कर रहा है। – Abizern

+0

मैंने इन निजी विधियों को एक विस्तार शीर्षलेख फ़ाइल में घोषित कर दिया है और किसी कारण से, XCode5 में संकलक शिकायत करता है जब एक्सटेंशन हेडर में इन निजी विधियों को कॉल किया जाता है। कोई विचार? – ArdenDev

4

लग रहा है एक और सवाल की तरह जवाब है: Is there a way to suppress warnings in Xcode?

+1

इसका उत्तर का हिस्सा है, लेकिन किसी विशेष मामले के लिए सबसे अच्छा (या कम से कम एक पूर्ण) समाधान शायद पीटर के उत्तर या मेरे उत्तर से संबंधित है। –

+0

यह डुप्लिकेट लिंक डालने का स्थान भी नहीं है। – Rambatino

124

याद रखें कि वास्तव में "निजी तरीकों" ऑब्जेक्टिव-सी में के रूप में ऐसी कोई बात नहीं है कि, और यह सिर्फ इसलिए है क्योंकि यह एक गतिशील भाषा है नहीं है। डिज़ाइन द्वारा, उद्देश्य-सी में इवर के लिए दृश्यता संशोधक हैं, लेकिन विधियों के लिए नहीं - यह दुर्घटना से नहीं है कि आप अपनी पसंद की किसी भी विधि को कॉल कर सकते हैं।

@ पीटर का सुझाव एक महान है। अपने उत्तर के पूरक के लिए, मैंने जिस विकल्प का उपयोग किया है (जब मैं निजी तरीकों के लिए हेडर नहीं चाहता/चाहती हूं) इकाई परीक्षण फ़ाइल में एक श्रेणी घोषित करता है। (मैं नाम के रूप में @interface MyClass (Test) का उपयोग करता हूं।) यह उन तरीकों को जोड़ने का एक शानदार तरीका है जो रिलीज कोड में अनावश्यक ब्लोट होगा, जैसे कि अंडर तक पहुंचने के लिए कि परीक्षा के तहत कक्षा तक पहुंच है। (यह स्पष्ट रूप से कोई समस्या नहीं रह जब गुण उपयोग किया जाता है।)

मैंने पाया इस दृष्टिकोण यह आसान बेनकाब और आंतरिक स्थिति है, साथ ही जोड़ने परीक्षण केवल तरीकों सत्यापित करने के लिए बनाता है। उदाहरण के लिए, this unit test file में, मैंने एक बाइनरी ढेर की शुद्धता की पुष्टि करने के लिए -isValid विधि लिखा था। उत्पादन में, यह विधि अंतरिक्ष की बर्बादी होगी, क्योंकि मुझे लगता है कि एक ढेर मान्य है - अगर मैं कोड संशोधित करता हूं तो यूनिट परीक्षण प्रतिगमन के परीक्षण के दौरान मुझे केवल इसकी परवाह है।

+4

महान सुझाव! मुझे यह विचार बेहतर पसंद है, संदर्भ में विधियों का जोखिम रखता है। – Bach

+1

वाह, पीटर होसे को अपना जवाब देने के लिए अपना जवाब ठीक करना चाहिए। महान काम, अब यह कोशिश कर रहा है +1 –

+0

भयानक, धन्यवाद! उपयोगी पोस्ट के लिए – kernix

3

निजी हेडर होने या अपनी खुद की श्रेणी को परिभाषित करने के दौरान शायद अधिक सही समाधान हैं, एक और बहुत ही सरल समाधान है: विधि को कॉल करने से पहले ऑब्जेक्ट को (आईडी) डालें।

+0

मैं कहूंगा कि यह बेहतर है। कोई डुप्लिकेशन नहीं, स्रोत फ़ाइलों का कोई विखंडन नहीं है और उद्देश्य-सी की गतिशील प्रकृति का लाभ उठाता है। – Michael

+1

@ माइकल xCode5 में इस दृष्टिकोण के साथ एक समस्या यह है कि एक अज्ञात चयनकर्ता का उपयोग चेतावनी का कारण बनता है। किसी विशेष इकाई परीक्षण को संकलित करते समय कंपाइलर को किसी भी तरह चयनकर्ता को देखना होता है। इस कारण से मुझे क्विन टेलर का समाधान पसंद है। –

3

यदि आप एकाधिक स्रोत फ़ाइलों में अपनी निजी विधि कार्यान्वयन को वितरित नहीं करना चाहते हैं, तो श्रेणी समाधान के लिए एक परिष्करण एक एक्सटेंशन को परिभाषित करना है (अनिवार्य रूप से एक अज्ञात श्रेणी - Apple's documentation का संदर्भ लें) एक हेडर फ़ाइल में जो दोनों द्वारा आयात किया गया है आपकी मौजूदा कक्षा 'कार्यान्वयन और प्रासंगिक इकाई परीक्षण स्रोत फाइलें।

एक एक्सटेंशन का उपयोग करने से संकलक आपको चेतावनी देता है कि निजी विधि का कार्यान्वयन मुख्य @ कार्यान्वयन ब्लॉक में मौजूद नहीं है। This link इसे अच्छी तरह से दिखाता है।

+0

कृपया यहां लिंक पोस्ट न करें, बल्कि कीवर्ड। सेब का लिंक ले जाया गया है। –

3

कुछ दिन पहले जब मैंने टीडीडी के साथ शुरुआत की थी तो मैं उसी मुद्दे से निपट रहा था। "मैं अपने निजी तरीकों का परीक्षण करना चाहिए?"

मैं अक्सर कहा गया है, या संबंधित सवाल "कैसे मैं अपने निजी तरीकों का परीक्षण करना चाहिए?" लोग: मैं देखने के इस बहुत ही दिलचस्प बात पाया है Test-Driven iOS Development पुस्तक में दूसरे प्रश्न पूछने पर यह माना गया है कि पहले का जवाब "हां" है और अब वे अपने परीक्षण सूट में अपने वर्गों के निजी इंटरफेस का पर्दाफाश करने का एक तरीका ढूंढ रहे हैं।

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

आपकी निजी विधियों का पहले से ही परीक्षण किया गया है क्योंकि आप जो भी कर रहे हैं वह उस व्यवहार को दोबारा कर रहा है जिसके लिए आपके पास पहले से परीक्षण हैं। आपको ऐसी स्थिति में कभी खत्म नहीं होना चाहिए जहां एक निजी विधि अनचाहे या अपूर्ण रूप से परीक्षण की जाती है, क्योंकि आप उन्हें केवल तभी बनाते हैं जब आप सार्वजनिक तरीकों के कार्यान्वयन को साफ करने का अवसर देखते हैं। यह सुनिश्चित करता है कि निजी विधियां केवल कक्षा के समर्थन के लिए मौजूद हैं कि उन्हें परीक्षण के दौरान बुलाया जाना चाहिए क्योंकि उन्हें निश्चित रूप से सार्वजनिक तरीकों से बुलाया जा रहा है।

+0

मैंने इस पुस्तक को पढ़ा और हालांकि वह किसी बिंदु पर सही है, वह सवाल का जवाब नहीं देता है। मैं एक आईबीएक्शन को इंटरफेस फ़ाइल में क्यों ले जाऊंगा (यह अन्य वर्गों के लिए निजी होगा)? यह एक मॉडल ऑब्जेक्ट नहीं है, हम यहां एक नियंत्रक के बारे में बात कर रहे हैं, विशेष रूप से एक व्यू कंट्रोलर (यह पुस्तक आईओएस पर यूआई परीक्षण के बारे में पर्याप्त बात नहीं करती है) –

+0

मेरी पोस्ट मूल प्रश्न पर प्रतिक्रिया है। मैंने सोचा कि उद्धरण में दिलचस्प दृष्टिकोण शामिल है, क्योंकि जब आपको निजी तरीकों का परीक्षण करने की आवश्यकता होती है, तो शायद इसका मतलब है कि आपको उन तरीकों को अलग वस्तु में ले जाना चाहिए। और छोटे तरीकों वाले छोटे वस्तुओं के लिए प्रोग्रामर का यह "अग्रणी" टीडीडी का मुख्य लाभ है। बेशक, इकाई परीक्षण यूआई परीक्षण के बारे में नहीं है। इसके लिए अन्य उपकरण (उपकरण में) और इसके लिए अन्य परीक्षण भी हैं। –

0

आसान काम। चरण: 1. आपके पास है - (एनएसएसटींग *) getTestString; इंटरफ़ेस फू के लिए अपने लक्ष्य मीटर फ़ाइल में

  1. अपने इकाई परीक्षण फ़ाइल में एक वर्ग जोड़ें:

    @interface DemoHomeViewController() - (NSString *) getTestString; @end

फिर, अब कुछ भी करें जो आप चाहते हैं।