2013-03-07 8 views
5

मैं एक बटन दबाने की है कि एक एनीमेशन बंद आग है, और एनीमेशन के पूरा होने पर, एक लेबल के पाठ में परिवर्तन के लिए एक विधि UIView animateWithDuration का उपयोग करता है परीक्षण। मैं एक परीक्षण लिखना चाहता हूं कि जब बटन दबाया जाता है, अंततः लेबल का पाठ ठीक से बदल जाता है।आईओएस TDD: एनिमेशन: पूरा होने:

बटन प्रेस IBAction [UIView animateWithDuration:animations:completion:] का उपयोग करेगा के कार्यान्वयन। मैं स्पष्ट रूप से नहीं चाहता कि मेरा यूनिट परीक्षण वास्तव में एक एनीमेशन को पूरा करने के लिए 0.5 सेकंड तक प्रतीक्षा करे।

मैं UIView मजाक के बारे में सोचा है, लेकिन यह एक दृश्य नियंत्रक करने के लिए एक निर्भरता के रूप में UIView सुई अजीब लगता है। इसके अलावा, मैं जिस मॉकिंग फ्रेमवर्क का उपयोग कर रहा हूं (ओसीमोकीटो) क्लास विधियों का मज़ाक उड़ाकर अच्छा काम नहीं कर रहा है।

मैं भी विधि swizzling या UIView के लिए एक परीक्षण वर्ग लेखन, और एक कार्यान्वयन है कि कुछ नहीं करता है का उपयोग करते हुए, लेकिन completion: ब्लॉक के बाद animations: ब्लॉक आह्वान के बारे में सोचा। ऐसा लगता है कि मेरे लिए थोड़ा टूटा हुआ है; मुझे चिंता है कि UIView पर कक्षा विधि के कार्यान्वयन को ओवरराइड करने से सड़क के नीचे अनपेक्षित परिणाम हो सकते हैं।

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

उत्तर

4

मैं बस एक संपत्ति है कि एनीमेशन की लंबाई निर्धारित करता है और यह 0.5 सेकंड के लिए डिफ़ॉल्ट होगा।

इस तरह, आपके परीक्षण 0 एनीमेशन अवधि की स्थापना की और देख सकते हैं कि लेबल के पाठ का इंतजार किए बिना अद्यतन किया जाता है कर सकते हैं।

यह dependency injection है, और यह बेतहाशा उपयोगी है तुम सिर्फ TDD के साथ शुरू करते हैं। यह आपके कोड को अधिक मॉड्यूलर और कम युग्मित बनाने का अच्छा दुष्प्रभाव भी है।

+0

इस बारे में उत्सुक: क्या कोई गारंटी है कि परीक्षण पूरा होने से पहले एनीमेशन चलाएगा? क्या यह एनीमेशन ब्लॉक किसी कारण या किसी अन्य कारण से देरी हो सकती है? – Ying

+1

यह वास्तव में एक अच्छा मुद्दा है। एनीमेशन रनलोप पर कतारबद्ध होगा, जिसका सामान्य रूप से एनीमेशन परीक्षण रिटर्न के बाद होगा। हालांकि, <= 0 की अवधि के साथ एनिमेटिंग एक विशेष मामला है जो परिवर्तन को तुरंत होने का कारण बनता है। –

+1

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

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