XCTest / XCTest.h Xcode 6 में निर्मित पुरानी परियोजनाओं पर नहीं मिला है


82

मेरे पास कुछ प्रोजेक्ट्स हैं जिन्हें मैं Xcode 6 Beta के साथ बनाने की कोशिश कर रहा हूं। सभी परियोजनाओं में कुछ प्रकार के पुस्तकालय हैं जो XCTest (किवी / XCTest और स्पेक्टा) का उपयोग करते हैं जो Xcode 6 में नहीं बनते हैं क्योंकि XCTest / XCTest.b पाया जायेगा।

fatal error: 'XCTest/XCTest.h' file not found
#import <XCTest/XCTest.h>

मैंने देखा कि XCTest.framework अब "लिंक लाइब्रेरीज़ इन बायनेरीज़" के साथ चरण सूची नहीं बनाता है, लेकिन यह ठीक है क्योंकि जब मैं Xcode 6 के साथ एक नया प्रोजेक्ट बनाता हूं तो ऐसा लगता है कि लाइब्रेरी स्वचालित रूप से लिंक हो गई है।

शायद कुछ प्रासंगिकता के लिए, मेरे XCTest-needing निर्भरता सभी Cocoapods के माध्यम से लाया जाता है।

क्या कोई ऐसी चीज है जिससे मैं अनजान हूं, मुझे अपने प्रोजेक्ट के साथ अपडेट करने की आवश्यकता है?

जवाबों:


142

नोट: Xcode 7 में बनाई गई किसी भी परियोजना के लिए इसकी आवश्यकता नहीं हो सकती है।

CocoaPods इस के लिए एक ठीक था यहाँ और यहाँ


किसी भी कोकोआपोड निर्भरता के लिए इसे ठीक करने के लिए आपको FRAMEWORK_SEARCH_PATHSकिसी भी पॉड टारगेट में निम्नलिखित को जोड़ना होगा, जिसमें XCTest (जैसे किवी, स्पेक्टा, FBSnapshotTestCase, आदि) की आवश्यकता होती है।

$(PLATFORM_DIR)/Developer/Library/Frameworks

स्क्रीनशॉट

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

यह Xcode के पुराने संस्करणों के लिए हानिकारक नहीं है, इसलिए उपयोग करने के लिए सुरक्षित होना चाहिए।


साभार स्क्वेयरफ्रॉग प्रासंगिक मुद्दा यहाँ है
मोटा जुहू २ issue

1
अगली रिलीज कब निर्धारित है?
फतुहोकू

6
यह XIM 6 GM में KIM के साथ काम नहीं करता है ..?
थॉमस क्लॉज़

3
मैं "Xcode 7 के लिए प्रासंगिक नहीं" से असहमत हूं। मुझे Xcode 7.1 में समस्या थी। समस्या के गायब होने के बाद मैंने उस रूपरेखा खोज पथ को जोड़ा जैसा कि ऊपर निर्देशित है। मुझे लगता है कि Xcode 7 में शुरू की गई परियोजना में समस्या नहीं होगी, लेकिन यहाँ सवाल नए Xcodes में पुरानी परियोजनाओं के निर्माण का है।
जेरी क्रिनॉक

1
XCode 9 के रूप में आपको FRAMEWORK_SEARCH_PATHS बिल्ड सेटिंग को $ (DEVELOPER_FRAMEWORKS_DIR) और $ (विरासत में मिला)
बेरी

40

मैं एक परियोजना में चारों ओर फ़ाइलों को ले जा रहा था। आपको बस इतना करना है अपने परीक्षण फ़ाइलों का चयन है xxxTests.mआदि और में file inspectorचयन targetके रूप में testऔर नहीं एक नियमित रूप से लक्ष्य के रूप में।


1
वास्तव में मेरे साथ क्या हुआ। मैंने ध्यान नहीं दिया कि जब मैंने इसे फ़ाइल के लिए लक्ष्य "स्थानांतरित" किया। मुझे इसके बारे में सोचना चाहिए था कि इसे कैसे स्थानांतरित किया गया (Xcode में हटाएं और फिर से जोड़ें)। धन्यवाद।
चाडबाग

1
सरल जवाब जो मेरे लिए काम किया। मुद्दे थे जब मैं अपनी फ़ाइलों का नाम बदल रहा था, और यह मेरे मामले में संकल्प था।
शमौन

17

मैंने देखा है कि XCTest केवल एक परीक्षण लक्ष्य के लिए उपलब्ध है (Xcode 6 में)। यदि आप किसी अन्य लक्ष्य के लिए XCTest का उपयोग कर रहे हैं (जो भी कारण हो), तो आपको XCTest.h not foundत्रुटि दिखाई देगी ।


बस। कोकोपोड्स स्टेटिक लाइब्रेरी प्रोजेक्ट्स / टारगेट बनाता है। अच्छा खोजो!
एरिक कर्बर

1
आपको अधिकांश XCTest से संबंधित कोड को परीक्षण लक्ष्य पर ले जाने की सबसे अधिक आवश्यकता होगी।
मुस्तफा

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

2
तो ... क्या तय है?
फतुहोकू

12

यह त्रुटि तब सामने आती है जब आपने एक फ़ाइल को जोड़ा है जहाँ XCTest का उपयोग परीक्षण लक्ष्य के बाहर किया जा रहा है। AppCode में इसे ठीक करने के लिए, आप किसी भी संदिग्ध फ़ाइल पर राइट क्लिक कर सकते हैं और 'मैनेज टारगेट' का चयन कर सकते हैं, फिर सुनिश्चित करें कि केवल परीक्षण लक्ष्य की जाँच की गई है।


मैं इस समस्या में एक से अधिक बार भाग चुका हूं।
pshah

यह मेरे साथ एक परियोजना में फ़ाइलों को स्थानांतरित करने और गलत लक्ष्य के तहत उन्हें फिर से जोड़ने के बाद हुआ।
गाइल्स

11

@squarefrog का सही उत्तर है, लेकिन आपको हर बार अपने पॉड्स को अपडेट करने के लिए मैन्युअल रूप से करते रहना होगा :(

यदि आप इसे अपने पॉडफाइल में जोड़ते हैं तो यह आपके लिए अतिरिक्त पथ को स्वचालित रूप से जोड़ देगा। उदाहरण के लिए यदि आप जोड़ना चाहते थे $(PLATFORM_DIR)/Developer/Library/Frameworksकरने के लिए FRAMEWORK_SEARCH_PATHSSpecta के लिए:

post_install do |installer|
    target = installer.project.targets.find { |t| t.to_s == "Pods-Tests-Specta" }
    if (target)
        target.build_configurations.each do |config|
            s = config.build_settings['FRAMEWORK_SEARCH_PATHS']
            s = [ '$(inherited)' ] if s == nil;
            s.push('$(PLATFORM_DIR)/Developer/Library/Frameworks')
            config.build_settings['FRAMEWORK_SEARCH_PATHS'] = s
        end
    else
        puts "WARNING: Pods-Tests-Specta target not found"
    end
end

ध्यान दें कि आपको "Pods-Tests-Specta"अपनी परियोजना सेटिंग्स से मिलान करने के लिए बदलने की आवश्यकता हो सकती है , या बस उस लूप का उपयोग करें जो @squarefrog द्वारा प्रत्येक लक्ष्य पर पुनरावृति करने का सुझाव दिया गया है।
21

1
मुझे गलत लगा- @squarefrog ने एक लूप का सुझाव नहीं दिया। मेरा मतलब है कि लाइनों को 2-3 @ deanWombourne के समाधान के साथ बदल दिया गया है: installer.project.targets.each do |targetसभी लक्ष्यों पर लूप करने और परिवर्तन लागू करने के लिए।
pix0r

2

मुझे कुछ समय बाद उसी समस्या का सामना करना पड़ा है जब मैंने बिल्ड चरणों से XCTest फ्रेमवर्क आयात किया है और इस मुद्दे को हल किया है।

बिल्ड चरणों-> XCTest.Framework> स्वच्छ और चलाएं। मुझे आशा है कि यह किसी एक के लिए उपयोगी होगा ।।

आपके संदर्भ के लिए ... मौजूदा परियोजना में XCTest आयात करें


इसने मेरे लिए काम किया, लेकिन मुझे नए परीक्षणों के लिए लक्ष्य सेटिंग्स में भी जाना पड़ा और सामान्य टैब पर ऐप के एपीआई के परीक्षण के लिए बॉक्स को चेक करना पड़ा।
फ्रैंक के।

1

लिखने के समय तक, कोकोपोड्स का नवीनतम संस्करण (0.33.1) समस्या के लिए ठीक नहीं है।

लेकिन अत्याधुनिक संस्करण करता है।

स्रोत से कोकोपोड्स के नवीनतम संस्करण को सेट करने के लिए इस गाइड का पालन करें । मैं खदान pod-devके मणि-स्थापित संस्करण से इसे अलग करने के लिए मेरा (गाइड में कवर) कहता हूं ।

इस दृष्टिकोण का लाभ यह है कि आपको अपने पॉडफाइल में अतिरिक्त स्क्रिप्टिंग की आवश्यकता नहीं है। आपको बस pod-dev installसामान्य के बजाय याद रखना होगा pod install


1

XCTest करने का सबसे अच्छा तरीका यह है कि इसे टेस्ट नेविगेटर (बाएं फलक में 5 वां आइकन) से जोड़ा जाए।

ऐसा करने पर, नई xx.mपरीक्षण फ़ाइल किसी एप्लिकेशन (दाएँ फलक में) को नहीं छोड़ती है (बाएं फलक में> लक्ष्य, आवरण एक्सटेंशन: ऐप), लेकिन एक बंडल (Wrapper एक्सटेंशन: xctest)

  • XCTest.framework लाल रंग में रहता है,
  • कुछ संशोधनों के कारण आपको त्रुटि हो सकती है 'XCTest/XCTest.h' file not found, ऐसा इसलिए है क्योंकि आपकी फ़ाइल किसी ऐप को लक्षित करने के लिए मिली थी।

0

यह मेरे द्वारा पाया गया सबसे आसान काम है। कोई परियोजना परिवर्तन आवश्यक नहीं है। और यह परिवर्तन तब तक जारी रहेगा जब तक आपका अगला Xcode अपग्रेड नहीं हो जाता:

cd /Applications/Xcode6-Beta7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks
ln -s ../../../../../Library/Frameworks/XCTest.framework

इसके साथ नकारात्मक पक्ष यह है कि यदि आप अपनी परियोजना को दूसरों के साथ साझा करते हैं, जैसा कि आपको उन्हें यह क्रिया करने के लिए प्राप्त करना होगा, तो हर बार एक Xcode अपडेट होता है। यह कोकोपोड्स कार्यान्वयन के साथ एक मुद्दा है, इसलिए कोकोपोड्स का उपयोग करके इसे हल करने के लिए समझ में आता है!
चौकोरफ्रॉग

माना। और यह सही नहीं है। लेकिन यह वास्तविक आसान है और आपके पास (ओ (1)) फली की संख्या के साथ अच्छी तरह से तराजू है। Xcode 6 संस्करणों की संख्या बेहतर रूप से बहुत सीमित थी :-)
स्टीवन क्रेमर

ढांचे को पथ खोज पथ में जोड़ने से यह कट नहीं लगता: परीक्षण बनाएंगे, लेकिन नहीं चलेंगे। जाहिर तौर पर टेस्ट बंडल XCTest ढांचे को हल करने में सक्षम नहीं होने के कारण।
स्टीवन क्रेमर

0

कोकोपोड्स के बिना एक परियोजना पर (इसलिए सीधे ओपी के सवाल का जवाब नहीं दे रहा था लेकिन शायद भविष्य में मेरे लिए या दूसरों के लिए मददगार), हमारे पास एक ही मुद्दा था। यह हमारे पिछले OCTest वस्तुओं को XCTest के साथ बदलकर हल किया गया था। उदाहरण के लिए, एक फ़ाइल MyApp.xcodeproj / project.pbxproj में यह अंतर है (छोटा); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.