2012-08-31 24 views
5

मैं यूनिट परीक्षण लिख रहा हूं यह जानने के लिए कि तत्व एक निश्चित निब पर मौजूद हैं या नहीं। उदाहरण के लिए, मैं एक निब्स विचारों के माध्यम से लूप करना चाहता हूं और यह जांचने के लिए कि कोई टेक्स्ट व्यू मौजूद है या नहीं, यह जांचने के लिए कि कोई संदर्भ संदर्भ आउटलेट 'commentTextView' के साथ मौजूद है या नहीं।क्या यह जांचना संभव है कि यूआई तत्व में एक निश्चित संदर्भ आउटलेट है या नहीं?

अभी, मैं सिर्फ अगर लक्ष्य (पता चल सके कि एक बटन जब यह क्लिक किया जाता है एक निश्चित चयनकर्ता कॉल करेंगे) की तरह मौजूद है तरीकों की जांच करने, लेकिन मैं क्या जरूरत है की जाँच करने के नहीं देख पा रहे।

+0

"दुकानों संदर्भित" वस्तु है कि वे संदर्भ पर Xcode द्वारा सूचीबद्ध हैं। यदि आपके पास यह निर्धारित करने के इरादे से टेक्स्ट व्यू है कि इसे किसी निश्चित आउटलेट द्वारा संदर्भित किया गया है, तो आप पहले ही जानते हैं कि टेक्स्ट व्यू मौजूद है। –

+0

@ पीटर होसे मान लें कि मेरे पास 3 बटन हैं। मैं जांचना चाहता हूं कि लॉगिन, रजिस्टर और सहायता के लिए बटन हैं या नहीं। UIButton के अस्तित्व की जांच करना सहायक नहीं है। मैं तर्क दूंगा कि जांच कर रहे हैं कि 3 बटन भी बेकार हैं। मैं क्या करना चाहता हूं यह जांचें कि क्या मौजूदा बटन हैं जो लॉगिन बटन से जुड़े हैं बटन, रजिस्टर बटन और हेल्प बटन। यह सत्यापित करेगा कि 3 बटन हैं, और वे ऐसा करते हैं जो उन्हें करना है (भरोसा है कि उन संदर्भों को कोड में जो करना है, वह करें)। –

+1

संभवतः आपके आउटलेट "फाइल मालिक" से जुड़े हुए हैं, या निब में कुछ रूट ऑब्जेक्ट हैं? क्या आप उस ऑब्जेक्ट को प्राप्त कर सकते हैं, जिन आउटलेट्स का परीक्षण करने का प्रयास कर रहे हैं, उनके माध्यम से पुन: प्रयास करें, और उनके अस्तित्व, विशिष्टता और अन्य गुणों को सत्यापित करें? –

उत्तर

0
इसके बजाय अगर वे एक आउटलेट है देखने के लिए जाँच की

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

0

मैं यहाँ मान्यताओं की एक जोड़ी बना रही हूँ, इसलिए यदि मैं आधार हूँ, मुझे पता है।

1) आप वस्तुओं जो दुकानों से कनेक्ट कर दिया जाएगा की एक सूची है, और उन दुकानों की एक सूची है। (उदाहरण के लिए, फ़ाइल के मालिक एक MyViewController वर्ग है और दुकानों view, label, button, और इतने पर है, वहाँ दुकानों delegate के साथ एक UITableView, और dataSource, आदि)

2) आपका महत्वपूर्ण व्यक्ति यह व्यावहारिक बनाने के लिए तैयार कर रहे हैं 1. उदाहरण के लिए में वस्तुओं के सभी को खोजने के लिए, अगर कुछ UIControl एक शीर्ष स्तर वस्तु या किसी प्रॉक्सी वस्तु द्वारा संदर्भित नहीं है, यह आसान viewWithTag:

मान लिया जाये साथ खोजने के लिए के लिए कोई टैग मूल्य दिया गया है ये सच हैं, तो आप परीक्षण कर सकते हैं कि निब मूल रूप से निम्नलिखित (छद्म कोड में) द्वारा लोड किया जाता है

for each referencingObject in nibObjects 
{ 
    for each outletName in referencingObject.outletNames 
    { 
     assertExistence(/* is an object referenced by this outlet? */) 
     assertProperties(/* does the object conform to the properties expected for this referencing object/outlet pairing? */) 
    } 
} 

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

ViewController *vc = [[ViewController alloc] init]; 
UINib *nib1 = [UINib nibWithNibName:@"ViewController1" bundle:nil]; 
NSArray *topLevelObjects = [nib1 instantiateWithOwner:vc options:nil]; 

ReferencingObject *filesOwnerReferencingObject = [[ReferencingObject alloc] init]; 
filesOwnerReferencingObject.object = vc; 

//Make a referenced object outlet for the view 
ReferencedOutlet *viewOutlet = [[ReferencedOutlet alloc] init]; 
viewOutlet.name = @"view"; 
viewOutlet.propertyAssertionBlock = ^(id object) { 
    UIView *theView = (UIView *)object; 
    STAssertEquals(1.0f, theView.alpha, @"shouldn't have any transparency"); 
}; 

//Make a referenced object outlet for the label 
ReferencedOutlet *labelOutlet = [[ReferencedOutlet alloc] init]; 
labelOutlet.name = @"label"; 
labelOutlet.propertyAssertionBlock = ^(id object) { 
    UILabel *theLabel = (UILabel *)object; 
    NSString *expectedLabelText = @"ViewController1.xib"; 
    STAssertTrue([expectedLabelText isEqualToString:theLabel.text], nil); 

}; 

filesOwnerReferencingObject.outlets = @[ viewOutlet, labelOutlet ]; 


NSArray *referencingObjects = @[ filesOwnerReferencingObject ]; 
for (ReferencingObject *referencingObject in referencingObjects) 
{ 
    for (ReferencedOutlet *outlet in referencingObject.outlets) 
    { 
     id object = [filesOwnerReferencingObject.object valueForKey:outlet.name]; 
     STAssertNotNil(object, nil); 
     outlet.propertyAssertionBlock(object); 
    } 
} 

और यहाँ मेरी इंटरफ़ेस/ReferencingObject और ReferencedOutlet वर्गों में से दिया गया है:

यहाँ परीक्षा पद्धति कोड मैं अपने SenTestCase उपवर्ग में लिखा है।

@interface ReferencingObject : NSObject 

@property (nonatomic, strong) id object; 
@property (nonatomic, strong) NSArray *outlets; 

@end 

@implementation ReferencingObject 
@end 

typedef void (^ReferencedOutletPropertyAssertionBlock)(id); 

@interface ReferencedOutlet : NSObject 

@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) ReferencedOutletPropertyAssertionBlock propertyAssertionBlock; 

@end 

@implementation ReferencedOutlet 
@end 

उम्मीद है कि यह उत्तर आपको या किसी और की मदद करेगा। अगर आपका कोई प्रश्न हैं, तो मुझे से पूछें।