2011-03-30 18 views
7

के साथ यूनिट और एप्लिकेशन टेस्ट के लिए ओसीएमॉक 1.77 का उपयोग करना मैं आईसी 4 और एक्सकोड 4/एसडीके 4.3 के साथ यूनिट और एप्लिकेशन परीक्षण के लिए ओसीएमॉक 1.77 का उपयोग करने की कोशिश कर रहा हूं। मैंने यहां पाया गया एक स्थिर पुस्तकालय के रूप में ओसीएमॉक का उपयोग करने के निर्देशों का पालन किया है: http://www.mulle-kybernetik.com/software/OCMock/। यूनिट और एप्लिकेशन टेस्ट ओसीएमॉक के बिना ठीक चलते हैं।आईओएस 4 और एक्सकोड 4/एसडीके 4.3

जब मैं ओसीएमॉक जोड़ता हूं और सिम्युलेटर (यूनिट परीक्षण) के लिए ओसीएमॉक के टेस्ट सूट को चलाने का प्रयास करता हूं, तो मेरा टेस्ट रिग कोड 134 के साथ दुर्घटनाग्रस्त हो जाता है। परीक्षण रिग एक डिवाइस (एप्लिकेशन परीक्षण) के लिए ठीक चलाता है। अगर मैं कंसोल में देखता हूं, तो मुझे नीचे दिया गया संदेश दिखाई देता है - जो बताता है कि मैंने उपर्युक्त यूआरएल पर निर्देशों के अनुसार -force_load लिंकर ध्वज नहीं जोड़ा है। लेकिन मेरे पास ... कोई विचार है?

मैंने इसे देखा: Test rig exited abnormally with code 134 with OCMock verify on iOS 4 जो यह सुझाव देता है कि यह व्यवहार एक बग है - लेकिन मुझे यकीन नहीं है कि यह वही स्थिति है क्योंकि मैं ओसीएमॉक टेस्ट सूट चला रहा हूं। यदि यह एक बग है, तो यूनिट परीक्षण में मोक्स का उपयोग करने के लिए एक कार्य-आसपास है?

टीआईए।

=====

कंसोल आउटपुट:

3/30/11 1:02:32 AM otest[38552] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '** Expected method not present; the method getArgumentAtIndexAsObject: is not implemented by NSInvocation. If you see this exception it is likely that you are using the static library version of OCMock and your project is not configured correctly to load categories from static libraries. Did you forget to add the -force_load linker flag?' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x004a05a9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x002cf313 objc_exception_throw + 44 
    2 CoreFoundation      0x00458ef8 +[NSException raise:format:arguments:] + 136 
    3 CoreFoundation      0x00458e6a +[NSException raise:format:] + 58 
    4 LogicTests       0x00f89de4 +[OCMockObject initialize] + 115 
    5 libobjc.A.dylib      0x002cfd9b _class_initialize + 380 
    6 libobjc.A.dylib      0x002d773f prepareForMethodLookup + 73 
    7 libobjc.A.dylib      0x002ce069 lookUpMethod + 86 
    8 libobjc.A.dylib      0x002ce1d6 _class_lookupMethodAndLoadCache + 40 
    9 libobjc.A.dylib      0x002e10e3 objc_msgSend + 87 
    10 SenTestingKit      0x20108824 +[NSObject(SenTestRuntimeUtilities) senAllSubclasses] + 107 
    11 SenTestingKit      0x201074a7 +[SenTestSuite updateCache] + 39 
    12 SenTestingKit      0x20107443 +[SenTestSuite suiteForBundleCache] + 92 
    13 SenTestingKit      0x201073a4 +[SenTestSuite testSuiteForBundlePath:] + 108 
    14 SenTestingKit      0x2010606b +[SenTestProbe specifiedTestSuite] + 332 
    15 SenTestingKit      0x20106792 +[SenTestProbe runTests:] + 156 
    16 otest        0x000023c7 0x0 + 9159 
    17 otest        0x000025f2 0x0 + 9714 
    18 otest        0x0000209a 0x0 + 8346 
    19 otest        0x00002049 0x0 + 8265 
) 

उत्तर

3

मैं -force_load झंडा निकाल कर इस पुन: पेश कर सकते हैं। यह सुनिश्चित करने के लिए जांचें कि यह आपके परीक्षण लक्ष्य पर सेट है, न कि आपके मुख्य लक्ष्य, और यह स्थिर पुस्तकालय के सही स्थान को इंगित करता है। मेरे मामले में, कि

-force_load $(PROJECT_DIR)/Libraries/libOCMock.a 

है other SO question आप लिंक किए गए सिर्फ कह रहा है कि जब एक नकली के verify पद्धति असफल हो जाती है, यह NSInvocation पर एक वर्ग विधि है, जो otest का कारण बनता है के क्रैश होने से एक अपवाद फेंकता है। यह अभी भी काम करता है; संदेश एक दावा विफलता की तुलना में बस अधिक गूढ़ है, जो XCode आपके परीक्षण वर्ग में एक त्रुटि के रूप में लेबल करता है।

+0

झंडे परीक्षण लक्ष्य पर सही ढंग से स्थापित कर रहे हैं। यूनिट टेस्ट लक्ष्य क्रैश होने से पहले भी मैं परीक्षण केस बनाने के लिए क्रैश करता हूं - इसलिए यह केवल एक गुप्त सम्बन्धी विफलता से अधिक है। – Erik

+0

मुझे यकीन है कि यह बग इस समस्या का कारण बन रहा है: http://openradar.appspot.com/8081169 – Erik

+0

वह बग उपरोक्त स्टैक ट्रेस का कारण नहीं है। वह बग इस तथ्य से संबंधित है कि अपवाद को पकड़ा नहीं जा सकता - ओसीएमॉक के संदर्भ में, इसका मतलब है कि एक सत्यापन विफलता वांछनीय त्रुटि से कम है, क्योंकि ओसीएमॉक विफलता को पकड़ नहीं सकता है और इसे लपेट सकता है। –

7
  • डाउनलोड OCMock ** * http://ocmock.org/#download से
  • एक OCMock/में खोल (या किसी अन्य फ़ोल्डर) (इस लेखन 1.77 के समय) -।> आप दो फ़ोल्डर होगा "रिलीज़" & "स्रोत "
  • कॉपी" रिलीज/लाइब्रेरी लक्ष्य आवेदन टेस्ट टा के रूप में अपने porject अंदर लाइब्रेरी "फ़ोल्डर
    • का चयन करें" अपने Xcode प्रोजेक्ट फ़ोल्डर
    • लिंक xcode सभी खींच के साथ अपने फाइल के अंदर फ़ोल्डर " rget!
  • अपने परीक्षण लक्ष्य
    • की "सेटिंग्स का निर्माण" के अंतर्गत "खोज पथ" जोड़ने के लिए जाओ: + "हैडर खोजें पथ" -> अपने OCMock हेडर के लिए पथ सम्मिलित (ज) ($ (PROJECT_DIR)/लाइब्रेरी/शीर्षलेख जैसे कुछ) + "लाइब्रेरी खोज पथ" -> अपनी ओसीएमॉक लाइब्रेरी में पथ डालें (।पथ के रूप में आप भी $ (PROJECT_DIR) या $ (SRCROOT)/का उपयोग करें और से बचने के लिए पुनरावर्ती चेकबॉक्स चुन सकते हैं ocmplete पथ
      • के तहत "सम्मिलित करें: क)/Library /) नोट ($ (PROJECT_DIR की तरह कुछ) लिंक करना "जोड़ने: +" अन्य लिंक झंडे "-> -all_load

सब कुछ अब सही ढंग से काम करना चाहिए। यह सत्यापित करने के लिए:

#import <OCMock/OCMock.h> 
// simple test to ensure building, linking, 
// and running test case works in the project 
- (void)testOCMockPass { 
id mock = [OCMockObject mockForClass:NSString.class]; 
[[[mock stub] andReturn:@"mocktest"] lowercaseString]; 
NSString *returnValue = [mock lowercaseString]; 
STAssertEqualObjects(@"mocktest", returnValue, @"Should have returned the expected string."); 
} 

- (void)testOCMockFail { 
id mock = [OCMockObject mockForClass:NSString.class]; 
[[[mock stub] andReturn:@"mocktest"] lowercaseString]; 
NSString *returnValue = [mock lowercaseString]; 
STAssertEqualObjects(@"thisIsTheWrongValueToCheck", returnValue, @"Should have returned the expected string."); 
} 

बहुत धन्यवाद करने के लिए:

एनरिको Bottani

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