मुझे एक्सकोड 5 के परीक्षणों में भी काफी परेशानी हुई है। यह अभी भी कुछ अजीब व्यवहार के साथ काफी छोटी गाड़ी प्रतीत होता है - हालांकि मुझे आपके विशेष XCTAssertEqual
काम करने का निश्चित कारण नहीं मिला है।
अगर हम परीक्षण कोड पर एक नजर है हम देखते हैं यह वास्तव में निम्नलिखित करता है (XCTestsAssertionsImpl.h
से सीधे लिया - यह वहाँ देखने के लिए आसान हो सकता है):
:
#define _XCTPrimitiveAssertEqual(a1, a2, format...) \
({ \
@try { \
__typeof__(a1) a1value = (a1); \
__typeof__(a2) a2value = (a2); \
NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \
NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \
float aNaN = NAN; \
NSValue *aNaNencoded = [NSValue value:&aNaN withObjCType:@encode(__typeof__(aNaN))]; \
if ([a1encoded isEqualToValue:aNaNencoded] || [a2encoded isEqualToValue:aNaNencoded] || ![a1encoded isEqualToValue:a2encoded]) { \
_XCTRegisterFailure(_XCTFailureDescription(_XCTAssertion_Equal, 0, @#a1, @#a2, _XCTDescriptionForValue(a1encoded), _XCTDescriptionForValue(a2encoded)),format); \
} \
} \
@catch (id exception) { \
_XCTRegisterFailure(_XCTFailureDescription(_XCTAssertion_Equal, 1, @#a1, @#a2, [exception reason]),format); \
}\
})
यहाँ समस्या है
वास्तव में परीक्षण क्या कर रहा है वह मान को NSValue
में एन्कोड कर रहा है और फिर उनकी तुलना कर रहा है। "ठीक है," आप कहते हैं, "लेकिन इसके साथ क्या समस्या है?" मैंने नहीं सोचा था कि तब तक एक था जब तक कि मैंने इसके लिए अपना खुद का टेस्ट केस नहीं बनाया। समस्या यह है कि NSValue के -isEqualToValue
को NSValue के एन्कोडिंग प्रकार के साथ-साथ इसके वास्तविक मान की तुलना भी करनी चाहिए। YES
लौटने की विधि के बराबर होना चाहिए।
आपके मामले में, arr.count
एक NSUInteger
है जो unsigned int
का टाइपिफ़ है। संकलन-समय स्थिर संभावित रूप से रनटाइम पर signed int
में खराब हो जाता है। इस प्रकार जब दोनों को NSValue
ऑब्जेक्ट में रखा जाता है, तो उनके एन्कोडिंग प्रकार बराबर नहीं होते हैं और इस प्रकार दोनों -[NSValue isEqualToValue]
के अनुसार बराबर नहीं हो सकते हैं।
आप इसे एक कस्टम उदाहरण के साथ साबित कर सकते हैं। निम्नलिखित कोड को स्पष्ट रूप से करता है वास्तव में क्या XCTAssertEqual
करता है:
// Note explicit types
unsigned int a1 = 3;
signed int a2 = 3;
__typeof__(a1) a1value = (a1);
__typeof__(a2) a2value = (a2);
NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))];
NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))];
if (![a1encoded isEqualToValue:a2encoded]) {
NSLog(@"3 != 3 :(");
}
"3 != 3 :("
लॉग में हर बार दिखाई देगा।
मैं यहां जोड़ना चाहता हूं कि वास्तव में, यह अपेक्षित व्यवहार है। तुलना करते समय NSValue
है जो इसकी टाइप एन्कोडिंग की जांच करता है। दुर्भाग्यवश यह नहीं है कि हम दो ('बराबर') पूर्णांक परीक्षण करते समय क्या उम्मीद कर रहे थे।
XCTAssertTrue
, संयोग से, और अधिक सरल तर्क है, और आम तौर पर बर्ताव करता है के रूप में उम्मीद (फिर से, यह कैसे निर्धारित करता है कि दावे विफल रहता है के लिए वास्तविक स्रोत देखें)।
कुछ अन्य महान मिलान पुस्तकालयों हैं: OCHamcrest और Expecta। । अच्छी इनबिल्ट मैचर पुस्तकालयों के साथ पूरी तरह से विकसित टेस्ट फ्रेमवर्क - कीवी और सीडर भी हैं। । (बस अगर आपने अभी तक इन कोशिश नहीं की है)। –