जैसा कि मैंने कीवी के साथ पहली बार किया था

नया क्या है?

इस लेख में मैं iOS के लिए एप्लिकेशन विकसित करते समय BDD तकनीक के अनुप्रयोग के बारे में बात करना चाहता हूं।
टीडीडी या बीडीडी: व्यवहार में पद्धतियों में से एक को आज़माना दिलचस्प था। चुनाव बीडीडी पर गिर गया। क्यों वास्तव में उसे? Ciklum के Kharkov कार्यालय में देवकैंप में उनके बारे में बात करना बहुत दिलचस्प था। क्यों कीवी? इस कुख्यात DevCamp'e पर भी उनकी चर्चा हुई। इसलिए, मैं अभ्यास में खुद को सब कुछ आज़माना चाहता था। इसलिए, जो बीडीडी के साथ उदाहरणों में रुचि रखते हैं, लाइन ब्रेक या कैलकुलेटर का परीक्षण करने की तुलना में थोड़ा अधिक जटिल है, मैं एक बिल्ली के लिए पूछता हूं।

समस्या का बयान


IOS के लिए सबसे आम व्यापार एप्लिकेशन डेवलपर क्या है? मेरी राय में, यह सर्वर से डेटा प्राप्त कर रहा है और इसे उपयोगकर्ता को प्रदर्शित कर रहा है। उदाहरण के लिए, एक एप्लिकेशन लिखा गया था जो स्टैकऑवरफ्लो वेबसाइट से iPhone टैग पर प्रश्न प्राप्त करने की समस्या को हल करता है और फिर उन्हें एक तालिका में प्रदर्शित करता है। मैं वास्तुकला और कार्यान्वयन की पेचीदगियों में नहीं तल्लीन हो जाऊंगा, बल्कि अपनी राय, चीजों में दिलचस्प पर अधिक विस्तार से लिखूंगा।

अनुरोध का परीक्षण कैसे करें?


संभवतः, सभी के पास ऐसी परिस्थितियां थीं जब वेब-टीम के समानांतर काम करते हुए, आप सर्वर तक नहीं पहुंच सकते थे। इसके कारण अलग हो सकते हैं, या तो यूआरएल बदल गया था, या सेवा टूट गई। सामान्य तौर पर, इससे कोई फर्क नहीं पड़ता। लेकिन क्या महत्वपूर्ण है कि यूनिट परीक्षण चलाने के दौरान जांच करना अच्छा होगा, लेकिन क्या हमारा सर्वर जवाब दे रहा है! "StackOverflowRequest" वर्ग सर्वर के साथ संचार करने के लिए जिम्मेदार है। हमें यह आवश्यक है कि जब सर्वर से डेटा सफलतापूर्वक प्राप्त किया जाए, तो "प्राप्तJSON:" विधि कहलाती है, और यदि यह विफल रहता है, तो यह "fetchFailedWithError:" कहता है। परीक्षण किए गए डेटा के रूप में, हम एक मान्य और अमान्य url का चयन करेंगे।

it(@"should recieve receivedJSON", ^ { NSString *questionsUrlString = @"http://api.stackoverflow.com/1.1/search?tagged=iphone&pagesize=20"; IFStackOverflowRequest *request = [[IFStackOverflowRequest alloc] initWithDelegate:controller urlString:questionsUrlString]; [[request fetchQestions] start]; [[[controller shouldEventuallyBeforeTimingOutAfter(3)] receive] receivedJSON:any()]; }); it(@"should recieve fetchFailedWithError", ^ { NSString *fakeUrl = @"asda"; IFStackOverflowRequest *request = [[IFStackOverflowRequest alloc] initWithDelegate:controller urlString:fakeUrl]; [[request fetchQestions] start]; [[[controller shouldEventuallyBeforeTimingOutAfter(1)] receive] fetchFailedWithError:any()]; }); 

दुर्भाग्य से, इस परीक्षण में परीक्षण की शर्तों में से एक का उल्लंघन किया जाता है: परीक्षण जल्दी से पास होना चाहिए। और जब से हम सर्वर से प्रतिक्रिया की प्रतीक्षा कर रहे हैं, यह अच्छा नहीं है। इसलिए, मैंने ifdef ब्लॉक में इन 2 परीक्षणों को संलग्न किया।

सर्वर से डेटा के लिए प्रतीक्षा का परीक्षण कैसे करें?

जैसा कि आप जानते हैं, यदि किसी प्रकार का डेटा लोड करना / प्रोसेसिंग करना है, तो हमें इसे उपयोगकर्ता को दिखाना होगा ताकि यह महसूस न हो कि एप्लिकेशन लटका हुआ है। सर्वर से चित्र डाउनलोड करते समय अक्सर ऐसा होता है। मेरे मामले में, मैं सिर्फ स्पिनर को दिखाता हूं। वह एल्गोरिथ्म जिसके द्वारा मैं निर्धारित करता हूं कि क्या चित्रों को लोड किया गया है, केवीओ का उपयोग करके लागू किया गया है।

 it(@"spiner should be visible during avatar loading", ^ { IFQuestionCell *cell = (IFQuestionCell *)[tableDelegate tableView:[UITableView new] cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; UIImageView *askerAvatar = (UIImageView *)[cell objectForPropertyName:@"askerAvatar"]; [askerAvatar.image shouldBeNil]; UIActivityIndicatorView *spiner = (UIActivityIndicatorView *)[cell objectForPropertyName:@"spiner"]; [spiner shouldNotBeNil]; [[theValue(spiner.hidden) should] equal:theValue(NO)]; [[theValue(spiner.isAnimating) should] equal:theValue(YES)]; }); it(@"spiner should be hidden when avatar is loaded", ^ { IFQuestionCell *cell = (IFQuestionCell *)[tableDelegate tableView:[UITableView new] cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; UIImageView *askerAvatar = (UIImageView *)[cell objectForPropertyName:@"askerAvatar"]; askerAvatar.image = [UIImage new]; UIActivityIndicatorView *spiner = (UIActivityIndicatorView *)[cell objectForPropertyName:@"spiner"]; [spiner shouldNotBeNil]; [[theValue(spiner.hidden) should] equal:theValue(YES)]; }); 

डेटा के साथ तालिका भरने की शुद्धता का परीक्षण कैसे करें?

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

 it(@"spiner cell should be last cell, if last cell is not visible on table", ^ { IFQuestion *q1 = [IFQuestion new]; IFQuestion *q2 = [IFQuestion new]; IFQuestion *q3 = [IFQuestion new]; IFQuestion *q4 = [IFQuestion new]; IFQuestion *q5 = [IFQuestion new]; IFQuestion *q6 = [IFQuestion new]; IFQuestion *q7 = [IFQuestion new]; IFQuestion *q8 = [IFQuestion new]; q1.questionID = 1; q2.questionID = 2; q3.questionID = 3; q4.questionID = 4; q5.questionID = 5; q6.questionID = 6; q7.questionID = 7; q8.questionID = 8; [tableDelegate addQuestions:@[q1, q2, q3, q4, q5, q6, q7, q8]]; IFSpinerCell *cell = (IFSpinerCell *)[tableDelegate tableView:tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:9 inSection:0]]; NSString *cellClassName = NSStringFromClass ([cell class]); [[cellClassName should] equal:NSStringFromClass ([IFSpinerCell class])]; for(NSInteger i = 0; i < 9; i++) { cell = (IFSpinerCell *)[tableDelegate tableView:tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; cellClassName = NSStringFromClass ([cell class]); [[cellClassName should] equal:NSStringFromClass ([IFQuestionCell class])]; } }); 

पुनश्च


इस लिंक पर क्लिक करके एक संपूर्ण उदाहरण पाया जा सकता है। आशा है कि यह लेख मददगार रहा है। मुझे आपके सवालों के जवाब देने में खुशी होगी, साथ ही टिप्पणियों और सुझावों को भी सुना जा सकेगा। आपका धन्यवाद

Source: https://habr.com/ru/post/In165725/


All Articles