2009-11-11 13 views
9

पहले से ही विकास में एक एप्लिकेशन के साथ शुरू संदर्भित, मैं iPhone विकास मार्गदर्शिका में दिए निर्देशों किए हैं - इकाई परीक्षण आवेदनलिंकर त्रुटि: iPhone यूनिट टेस्ट बंडल अनुप्रयोग कक्षाएं

मैं सफलतापूर्वक शामिल हैं और मेरे ऐप की उपयोग कर सकते हैं डिवाइस पर चलने वाले एप्लिकेशन-स्टाइल परीक्षणों में कक्षाएं, और उनके परिणामों को कंसोल पर आउटपुट करें।

मैं निम्न कोड पंक्ति जोड़ते हैं:

STAssertTrue([viewController isKindOfClass:[LoginViewController class]], @"Top view controller is not LoginViewController"); 

निम्नलिखित निर्माण त्रुटि उत्पन्न होता है:

Undefined symbols: 
    "_OBJC_CLASS_$_LoginViewController", referenced from: 
     [email protected] in LoginViewTest.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

मैं, परियोजना और परीक्षण लक्ष्य के लिए और अधिक विन्यास जानकारी प्रदान कर सकते हैं, लेकिन सेटअप परीक्षण स्रोत में [LoginViewController class] लाइन के बिना फ़ाइल काम करता है।

उस पंक्ति के बिना, मैं कक्षा का संदर्भ दे सकता हूं, इसकी संपत्तियों का उपयोग कर सकता हूं और इसे संदेशों को सफलतापूर्वक भेज सकता हूं।

क्या कोई लिंकिंग बिल्ड सेटिंग है, या बंडल लोडिंग विकल्प है जो इस फैशन में ऐप क्लास का उपयोग करने का प्रयास करते समय आवश्यक है? या मुझे यह पुष्टि करने के लिए एक और प्रकार का परीक्षण मिलना चाहिए कि किसी ऑब्जेक्ट की कक्षा अपेक्षित है?

उत्तर

18

मुझे एक उत्तर मिला है, लेकिन मुझे लगता है कि एक "बेहतर" तरीका होना चाहिए?

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

${TARGET_BUILD_DIR}/AppName.app/AppName 

यूनिट टेस्ट बंडल आपके ऐप्लिकेशन के इकाई परीक्षण लक्ष्य की निर्भरता (जैसे कि, AppName Testing) के रूप में बनाया जा रहा है, और एक परिणाम के रूप में मैं अनुप्रयोग निष्पादन ऊपर से किसी भी बेहतर हल करने में सक्षम नहीं किया गया है।

शुद्ध परिणाम किसी भी लिंकर त्रुटियों के बिना परीक्षण लक्ष्य में इंजेक्शन एक कार्य इकाई परीक्षण है। परीक्षण अपेक्षित वर्गों को चलाते हैं और एक्सेस करते हैं।

संपादित करें: बंडल लोडर - लक्ष्य विन्यास

यह लक्ष्य है कि है नहीं छिपाने यह प्रतीक है करने के लिए परीक्षण बंडल "की मेजबानी" कॉन्फ़िगर करने के लिए महत्वपूर्ण है।

GCC_SYMBOLS_PRIVATE_EXTERN = NO 

a.k.a. "डिफ़ॉल्ट रूप से छिपे प्रतीक"।

When enabled, all symbols are declared 'private extern' unless explicitly marked to be exported using '__attribute__((visibility("default")))' in code. If not enabled, all symbols are exported unless explicitly marked as 'private extern' .

For more information, see http://developer.apple.com/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html .

+0

यह मुझे सही दिशा में धन्यवाद, धन्यवाद। मेरी समस्या यह थी कि मैंने मुख्य लक्ष्य में "उत्पाद का नाम" बदल दिया था, और इसलिए मुझे परीक्षण लक्ष्य में "बंडल लोडर" अपडेट करना पड़ा। –

+0

उत्कृष्ट जवाब, वास्तव में बहुत बहुत धन्यवाद। जब आप किसी मौजूदा प्रोजेक्ट पर परीक्षण स्थापित कर रहे हों तो बहुत सहज नहीं है। वैसे भी यह अब काम कर रहा है !! इसके अलावा, मुझे बंडल लोडर सेटिंग खोजने में थोड़ी देर लग गई, सुनिश्चित करें कि बिल्ड सेटिंग्स के शीर्ष पर 'ऑल' चेक किया गया है और अंततः 'बेसिक' – Sam

+0

उघ नहीं है। मैंने वही काम किया और पता था कि क्या हो रहा था, लेकिन मैं अपने जीवन के लिए इसे ठीक करने के लिए शापित निर्माण सेटिंग नहीं ढूंढ सका। बहुत धन्यवाद। – DougW

1

मैं बस यहाँ पर यह उत्तर दिया:: प्रलेखन से

iPhone unit testing: Symbols not found when calling custom code

मैं इनमें से एक डुप्लिकेट के रूप में बंद किया जाना चाहिए मान लें कि? मैं ऐसा करने के लिए पर्याप्त सम्मानित नहीं हूं ...


मैं भी पीछा किया एप्पल के iPhone यूनिट टेस्टिंग आवेदन दस्तावेज़ और एक लिंक करने में त्रुटि प्रश्न में वर्णित जब इकाई परीक्षण मेरी वर्गों में से एक करने की कोशिश कर के समान देखा।

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

अब वह कक्षा आपके परीक्षणों के साथ संकलित की जाएगी और आपके यूनिट परीक्षण में उपलब्ध होनी चाहिए। चेक को दोबारा करने के लिए, बाईं ओर स्थित 'समूह & फ़ाइलें' ब्राउज़र में 'लक्ष्य/तर्क परीक्षण/संकलन संसाधन' नोड का विस्तार करें। यह लक्ष्य बनाने के दौरान उपलब्ध सभी वर्ग फ़ाइलों को सूचीबद्ध करता है और अब अपनी कक्षा परीक्षण कक्षा को परीक्षण के तहत अपनी कक्षा के साथ शामिल करना चाहिए।

(ध्यान दें कि जब आप फ़ाइल का नाम देते हैं तो 'नई फ़ाइल ...' विंडो के उसी पृष्ठ पर - जब आप कोई नया एप्लिकेशन या टेस्ट क्लास बनाते हैं तो आपको सभी उपयुक्त लक्ष्यों का चयन करना होगा)।

(मैं XCode 3.2.3 & ओएस 4.0 का उपयोग कर रहा हूं)।

+0

आपके नोट आमतौर पर ठीक हैं। लेकिन वे मुझसे पूछे गए प्रश्न का समाधान नहीं करते हैं। मेरा प्रश्न और उत्तर लिंक समय पर इंजेक्शन इकाई परीक्षण बंडल से उपलब्ध प्रतीकों के साथ सौदा करता है। यह आपके द्वारा लिंक किए गए दूसरे प्रश्न से संकेतित त्रुटि भी है। आपका जवाब "परीक्षण" लक्ष्य स्थापित करने का एक महत्वपूर्ण हिस्सा है, लेकिन हमारे दोनों मामलों में जो कोई समस्या नहीं पैदा कर रहा था। – ohhorob

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