मैं अपना पहला आईओएस यूनिट परीक्षण (एक्सकोड 5, आईओएस 6) लिख रहा हूं और पाया कि यूनिट परीक्षणों के परिणाम हाल ही में सिम्युलेटर में किए गए कार्यों के आधार पर भिन्न होते हैं। जैसे मैं सिम्युलेटर में अपनी संपर्क सूची में किसी उपयोगकर्ता पर क्लिक करता हूं, और अब उपयोगकर्ता डिफॉल्ट में मेरे "हालिया संपर्क" डेटा में पहले की तुलना में एक और ऑब्जेक्ट है, भले ही मैं यूनिट परीक्षण चला रहा हूं।एनएसयूसर डीफॉल्ट इकाई परीक्षणों के लिए साफ स्लेट नहीं होना चाहिए?
इकाई परीक्षण के लिए, यादृच्छिक उपयोगकर्ता डिफ़ॉल्ट डेटा (मैं अपने स्वयं के स्वच्छ डीबी के साथ RoR परीक्षणों में उपयोग किया जाता है) के लिए साफ नहीं है। इसके अलावा, मैं खाली "हालिया संपर्क" डेटा जैसे विशिष्ट राज्यों का परीक्षण करना चाहूंगा।
यहां संबंधित प्रश्नों को देखने से, मुझे कुछ संभावित उत्तर दिखाई देते हैं जिनसे मैं खुश नहीं हूं।
- यूनिट परीक्षणों के लिए उपयोगकर्ता उपयोगकर्ता डिफ़ॉल्ट करें! मुझे कई मौजूदा वर्गों को संशोधित करना होगा ताकि मैं उस नकली इंजेक्ट कर सकूं।
- एक सेटअप विधि में UserDefaults को साफ़ या अनुकूलित करें! लेकिन फिर मैन्युअल परीक्षण में श्रमिक रूप से बनाया गया मेरा डेटा चला जाएगा।
- एक सेटअप में उपयोगकर्ता डिफ़ॉल्ट को साफ़ या अनुकूलित करें तो उन मानों को आंसू में पुनर्स्थापित करें! आउच।
ये यूनिट परीक्षणों में मानक अभ्यास होने के लिए अनावश्यक रूप से जटिल लगते हैं। मैं हर यूनिट परीक्षण में खुद को दोहराना नहीं चाहता हूं। तो, मेरे प्रश्न हैं:
- क्या मुझे उपयोगकर्ता परीक्षण को यूनिट टेस्ट रन के माध्यम से विज्ञापन-प्रसार सिम्युलेटर परीक्षण से जारी रखने के तरीके के बारे में कुछ वांछनीय याद आ रही है?
- क्या इसे ठीक करने के लिए एक कॉन्फ़िगर करने योग्य तरीका है, यूनिट परीक्षण लक्ष्य को मैन्युअल रूप से परीक्षण करने के लिए सिम्युलेटर का उपयोग करते समय यूनिटडिफॉल्ट के लिए अलग-अलग संग्रहण स्थान रखने के लिए कुछ तरीका कहें?
- विफल होने पर, कोड में ऐसा करने का एक शानदार तरीका है?
- उदाहरण के लिए, मेरे पास XAppestCase से MyAppTestCase ऑब्जेक्ट प्राप्त हो सकता है और हमेशा सेट अप करने के लिए setUp और tearDown विधियों को ओवरराइड कर सकता है और फिर UserDefaults को पुनर्स्थापित कर सकता है। यह एक अच्छा विचार है?
आपको यूनिट को डिफ़ॉल्ट रूप से परीक्षण नहीं करना चाहिए क्योंकि ऐसा कुछ है जिस पर आपका कोई प्रत्यक्ष नियंत्रण नहीं है। एक इकाई परीक्षण को परमाणु सॉफ्टवेयर इकाई पर ही काम करना चाहिए -> कोई अन्य कक्षाएं या सेवाएं शामिल नहीं होनी चाहिए। आपका दृष्टिकोण एकीकरण परीक्षण की तरह बहुत अधिक लगता है। उत्तरार्द्ध आमतौर पर मॉक अप इंटरफेस का उपयोग करेगा। – Till
मुझे लगता है कि आपने मेरे प्रश्न को गलत समझा। मैं कुछ ऐसी चीजों को खींचने के बिना यूनिट परीक्षण कैसे करूं जिन पर मेरा कोई प्रत्यक्ष नियंत्रण नहीं है? मैं वास्तविक मूल्यों के साथ उपयोगकर्ता डिफ़ॉल्ट में खींचने का इरादा नहीं था। – LisaD
एक और समाधान ओसीएमॉक जैसे अलगाव ढांचे का उपयोग करना होगा। NSUserDefaults प्रकार की संपत्ति के रूप में अपनी कक्षा में एक तथाकथित सीम जोड़ें। परीक्षा के तहत कक्षा को मानक संपत्ति में संग्रहीत मानक यूज़र डीफॉल्ट के साथ शुरू किया जाएगा। अपने परीक्षण में आप डिफ़ॉल्ट वस्तु को नकली/स्टब के साथ ओवरराइट कर सकते हैं। उचित और verbose उत्तर के लिए –