2009-11-08 6 views
5

के लिए सर्वोत्तम प्रथाएं ठीक है इसलिए मैं हाल ही में आईओसी में प्रवेश करने की कोशिश कर रहा हूं। हालांकि, मैं एक बाधा में दौड़ता रहता हूं - यही तथ्य है कि मैं नकली वस्तुओं का उपयोग करना पसंद करता हूं।यूनिट परीक्षण, नकली वस्तुओं, और आईओसी

वे सेटअप करने के लिए त्वरित और दर्द रहित हैं।

हालांकि, अगर मैं अपने कोड में हर जगह आईओसी का उपयोग तो यह मेरे नकली वस्तुओं का उपयोग कर (यानी। Moq का प्रयोग करके) की मेरी वस्तुओं की कसौटी पर कार्यान्वयन (और विन्यास) बनाने के लिए बजाय बाध्य करती है।

अंतिम परिणाम यह है कि मैं परीक्षण के लिए बड़ी विन्यास फाइलों के साथ समाप्त होता हूं।

इसके अलावा परीक्षण में कई परिदृश्य हैं जहां मुझे टेस्ट-टू-टेस्ट आधार पर मेरी कक्षाओं से अलग व्यवहार की आवश्यकता होती है। Moq वस्तुओं के साथ यह बेहद आसान है। आप आईओसी के साथ कुछ कैसे करेंगे?

किसी भी मदद की बहुत सराहना की जाएगी।

धन्यवाद,
माइक

+0

क्या आप समस्या के बारे में अधिक जानकारी दे सकते हैं? मुझे समझ में नहीं आता कि आपको कोई समस्या क्यों है या क्यों। शायद एक कोड नमूना? –

+0

यदि आप इंजेक्शन का उपयोग कर रहे हैं, तो आपकी कक्षा में निर्भरता को आमतौर पर कन्स्ट्रक्टर या गुणों में इंजेक्शन दिया जाना चाहिए - इसलिए आपके परीक्षण में, आपके पास मोक्स द्वारा इंजेक्शन वाले स्थान को बदलने के लिए आवश्यक सभी सीम होनी चाहिए। क्या आप एक विशिष्ट मामले पर विस्तार कर सकते हैं जिसके साथ आप संघर्ष कर रहे हैं? – Mathias

+0

यूनिट परीक्षण के लिए आप आईओसी कंटेनर का उपयोग क्यों कर रहे हैं? – mwjackson

उत्तर

5

आईओसी नकली वस्तुओं कठिन, आसान नहीं का उपयोग करते हुए बनाना चाहिए।

कई आईओसी कंटेनर ढांचे आपको पूर्व-मौजूदा वस्तुओं को इंजेक्ट करने के लिए परिभाषित करने की अनुमति देंगे; Moq के साथ आप इसे myMockObject.Object के लिए सेट अप करेंगे।

संपादित करें: एक नकली के साथ Unity को विन्यस्त का उदाहरण:

var mockService = new Mock<IMyService>(); 
container.RegisterInstance<IMyService>(mockService.Object); 

वैकल्पिक रूप से, तुम सिर्फ परीक्षण (निर्माता इंजेक्शन के लिए) के तहत वर्ग के निर्माता में नकली वस्तु पारित कर सकते हैं और आईओसी कंटेनर बाईपास पूरी तरह से अपने यूनिट परीक्षण में।

संपादित करें: जोश का उत्तर वैकल्पिक विकल्प का एक अच्छा उदाहरण है। मैं आमतौर पर कंटेनर को फिर से कॉन्फ़िगर करने के बजाय अपने समाधान के साथ जाऊंगा।

+0

अच्छा दिखा रहा है कि परीक्षण के लिए आईओसी का उपयोग कैसे करें। हमने वेब संदर्भ के बाहर डब्लूसीएसएफ के साथ उपयोग के लिए अपना आईओसी रोल करना शुरू कर दिया। यह आश्चर्यजनक रूप से आसान था और निर्भरता इंजेक्शन और आईओसी पैटर्न को समझने में उत्कृष्ट अभ्यास होने लगा। – Josh

3

मैं आईओसी प्यार करता हूँ, और मैं मुझे कुछ नकली वस्तुओं प्यार ...

इन दोनों के साथ कोई विवाद नहीं है। यदि आप किसी भी प्रकार की निर्भरता इंजेक्शन कर रहे हैं तो आपको अपने पसंदीदा मॉकिंग फ्रेमवर्क का उपयोग करके नकली वस्तुओं को बनाना होगा और फिर उन्हें अपने एसयूटी में पास करना होगा।

[Test] 
public void AnAwesomeTest() 
{ 
    IDependencyOne d1 = MyMocker.Create<IDependencyOne>(); 
    IDependencyTwo d2 = MyMocker.Create<IDependencyTwo>(); 

    //Constructor injection 
    SUT sut = new SUT(d1); 

    //Property Injection 
    sut.DependantProperty = d2; 

    //Do some stuff and Assert 
} 
+0

+1। ध्यान दें कि यह Moq के साथ "नया SUT (d1.Object)" होगा। – TrueWill

+0

दिलचस्प। मैं खुद RhinoMocks के लिए उपयोग किया जाता है ... अगर वाक्यविन्यास इसे दूर नहीं देता है। – Josh

+0

@ जोश: एक अंतर यह है कि डी 1 और डी 2 प्रकार का मॉक <आईडी निर्भरता ...> होगा। डाउनसाइड करना है। इंटरफ़ेस पर पहुंचने के लिए, ऊपर की ओर डी 1 और डी 2 पर उम्मीदों को सेट करने में सक्षम है। पुस्तकालयों की तुलना/विपरीतता के लायक है; उनके पास विभिन्न दर्शन हैं। मैंने कुछ समय पहले राइनो से मोक तक स्विच किया था। – TrueWill