ios परीक्षण लक्ष्यों में ऐप स्रोतों को कब शामिल करने की आवश्यकता है?




objective-c xcode (5)

मेरे लिए यह योजना के लिए कोई परीक्षण लक्ष्य नहीं जोड़ा गया था।

ऐप लक्ष्य के लिए योजना संपादित करने के लिए जाएं, फिर दाईं ओर टेस्ट पर क्लिक करें, फिर नीचे दिए गए + बटन के साथ एक परीक्षण लक्ष्य जोड़ें:

एक नई परियोजना में मेरे पास यह सरल परीक्षण है

#import <XCTest/XCTest.h>
#import "ViewController.h"

@interface ViewControllerTests : XCTestCase
@end

@implementation ViewControllerTests

- (void)testExample
{ 
    // Using a class that is not in the test target.
    ViewController * viewController = [[ViewController alloc] init];
    XCTAssertNotNil(viewController, @"");
}

@end

ViewController.h परीक्षण लक्ष्य का हिस्सा नहीं है, फिर भी यह संकलित करता है और बिना किसी समस्या के परीक्षण चलाता है।

मुझे लगता है कि ऐसा इसलिए है क्योंकि आवेदन पहले (निर्भरता के रूप में) बनाया गया था, फिर परीक्षण। इसके बाद लिंकर इसे देखता है कि व्यू कंट्रोलर क्लास क्या है।

हालांकि, एक पुरानी परियोजना पर, बिल्कुल वही परीक्षण और व्यू कंट्रोलर फ़ाइल के साथ, लिंक लिंकर चरण में विफल रहता है:

Undefined symbols for architecture i386:
"_OBJC_CLASS_$_ViewController", referenced from:
  objc-class-ref in ViewControllerTests.o

यह लिंकर त्रुटि तब भी होती है जब एक ताजा XCTest इकाई परीक्षण लक्ष्य बनाया जाता है।

इसके बजाय इसे पाने के लिए, ऐप और परीक्षण लक्ष्यों दोनों में स्रोतों को शामिल करना संभव है (उपर्युक्त छवि में दोनों बक्से पर टिकटें)। इससे सिम्युलेटर के सिस्टम लॉग में डुप्लिकेट प्रतीकों के लिए चेतावनियां पैदा होती हैं (सिम्युलेटर खोलें और इसे देखने के लिए cmd- / दबाएं):

Class ViewController is implemented in both 
[...]/iPhone Simulator/ [...] /MyApp.app/MyApp and 
[...]/Debug-iphonesimulator/LogicTests.octest/LogicTests. 
One of the two will be used. Which one is undefined.

ये चेतावनियां कभी-कभी निम्नलिखित उदाहरणों से सचित्र मुद्दों का कारण बनती हैं:

 [viewController isKindOfClass:[ViewController class]]; // = NO
 // Memory address of the `Class` objects are different.

 NSString * instanceClassString = NSStringFromClass([viewController class]);
 NSString * classString         = NSStringFromClass([ViewController class]);

 [instanceClassString isEqualToString:classString]; // = YES
 // The actual class names are identical

तो सवाल यह है कि पुराने प्रोजेक्ट में सेटिंग (ओं) को एप्लिकेशन लक्ष्य फ़ाइलों को परीक्षण लक्ष्य में शामिल करने की आवश्यकता है?

टिप्पणियों का सारांश

कामकाजी और गैर-कामकाजी परियोजना के बीच:

  1. लिंकर आउटपुट ( Ld शुरू होने वाला कमांड) में कोई अंतर नहीं है।
  2. लक्ष्य निर्भरताओं में कोई अंतर नहीं है (परीक्षण लक्ष्य के लिए 1 निर्भरता है, जो ऐप है)
  3. लिंकर सेटिंग्स में कोई अंतर नहीं है।

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


एक्सकोड 6.2 में मेरे मामले में परियोजना लक्ष्य और परीक्षण लक्ष्य में विभिन्न आर्किटेक्चर में त्रुटि थी।

परियोजना लक्ष्य में केवल armv7 और armv7s आर्किटेक्चर हैं (कुछ पुरानी लाइब्रेरी के कारण)

प्रोजेक्ट टेस्ट लक्ष्य में armv7, armv7s और arm64 आर्किटेक्चर हैं।

Arm64 आर्किटेक्चर को हटाने से मेरे मामले के लिए इस समस्या को हल किया जा सकता है।

Project Editor -> Project Tests target -> Build Settings -> Valid Architectures = armv7 armv7s

(शायद $ (ARCHS_STANDARD) $ (ARCHS_STANDARD_32_BIT) के बजाय "आर्किटेक्चर" सेट करने के लिए भी इसकी आवश्यकता है)


एक्सकोड 6 पर, मैं परीक्षण लक्ष्य> सामान्य> परीक्षण में "होस्ट होस्ट एपीआई परीक्षण की अनुमति दें" की जांच करके इस समस्या को ठीक करने में सक्षम था।


जवाब जैक्सस्लाश और eph515 के उत्तरों का एक संयोजन था।

symbols hidden by default रूप से छिपाए गए eph515 के उत्तर symbols hidden by default डीबग के लिए नहीं होना चाहिए।

डीबग के लिए deployment postprocessing भी नहीं होना चाहिए।

परीक्षण लक्ष्यों में शामिल सभी पुस्तकालयों को इकाई परीक्षण से हटा दिया जाना चाहिए। जो कुछ भी छोड़ा जाना चाहिए वह स्क्रीन शॉट में 3 और यूनिट परीक्षण के लिए विशिष्ट कुछ भी है।

यदि सूची के अंत में एक रन बिल्ड स्क्रिप्ट बिल्ड चरण भी है, तो इसे हटाया जाना चाहिए (क्योंकि यह इकाई परीक्षण का आर्टेफैक्ट है)।

फिर जैकस्लाश के जवाब में सबकुछ करें ।