इंटरफ़ेस के बिना मैं कक्षा कैसे बना सकता हूं?

मैं विंडोज 7 में सी # का उपयोग कर .NET 4.0 पर काम कर रहा हूं।

मैं नकली का उपयोग कर कुछ तरीकों के बीच संचार का परीक्षण करना चाहता हूं। एकमात्र समस्या यह है कि मैं इसे एक इंटरफ़ेस लागू किए बिना करना चाहता हूं। क्या यह संभव है? मैंने नकली वस्तुओं के बारे में बहुत से विषयों और कुछ ट्यूटोरियल पढ़े हैं, लेकिन उनमें से सभी इंटरफेस का मज़ाक उड़ाते हैं, न कि कक्षाएं। मैंने राइनो और मोक ढांचे का उपयोग करने की कोशिश की।

0
इस उत्तर में यहां वर्णित कई विधियां नहीं हैं
जोड़ा लेखक BlueRaja - Danny Pflughoeft, स्रोत
दुर्भाग्यवश, वह पैटर्न अपरिवर्तनीय प्रकार "पैटर्न" के साथ संघर्ष करता है :(
जोड़ा लेखक Matthew Watson, स्रोत
यह वास्तव में काटता है कि ये उपकरण विशेष रूप से "IInterfaces" का उपयोग करने के परिप्रेक्ष्य से बनाए जाते हैं।
जोड़ा लेखक A.R., स्रोत
यह माना जाता है कि आप इंटरफ़ेस आधारित DI का उपयोग कर रहे हैं। यह इन दिनों एक सुंदर मानक पैटर्न है।
जोड़ा लेखक Maess, स्रोत

8 उत्तर

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

आपके कोड में इंटरफेस बनाने का विचलन क्यों?

0
जोड़ा
"केवल परीक्षण का परीक्षण करना है" लेकिन आपके लिए महत्वपूर्ण टेस्टेबल कोड नहीं बना रहा है?
जोड़ा लेखक MakkyNZ, स्रोत
चूंकि यह कई इंटरफेस के साथ कोडबेस को ढकता है, जो परीक्षण ढांचे की कुछ तकनीकी सीमा के लिए नहीं है, तो पूरी तरह से अनावश्यक होगा?
जोड़ा लेखक BlueRaja - Danny Pflughoeft, स्रोत
आपने अभिव्यक्ति "पहुंच से अधिक पहुंच" सुना है। यह बताता है कि डेवलपर्स हमेशा शिकायत क्यों कर रहे हैं। सी # भाषा को यूनिट परीक्षण के साथ दिमाग में डिजाइन नहीं किया गया था। यही कारण है कि व्यर्थ इंटरफेस या आभासी तरीकों के जबरदस्त अव्यवस्था के बिना नकली निर्भरताओं को इंजेक्ट करना वाकई मुश्किल है। शायद कोई जल्द ही ऐसी भाषा का आविष्कार करेगा जो यूनिट-टेस्ट के लिए आसान है। तब तक हमारे पास शिकायत करने के लिए कुछ और होगा।
जोड़ा लेखक John Henckel, स्रोत
@ BlueRaja-DannyPflughoeft जो विधियों वर्चुअल को चिह्नित करने के लिए समान रूप से रखता है। =/हेक, मैं एक ऐसे मामले को देख रहा हूं जहां मैं पूरी कक्षा को कोड static में बना सकता हूं अगर मैं इसे मजाक करने के बारे में सोच नहीं रहा था। (यह सिर्फ विधियों का संग्रह है। इसमें कोई राज्य नहीं है और कभी नहीं होगा।)
जोड़ा लेखक jpmc26, स्रोत
मुझे यह जानकर खुशी हो रही है कि मैं अकेला नहीं हूं जो इंटरफेस और वर्चुअल विधियों को अव्यवस्था के रूप में देखता है यदि उनका एकमात्र उद्देश्य परीक्षण की सेवा करना है।
जोड़ा लेखक aaaaaa, स्रोत

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

उदाहरण के लिए:

सेवा जिसे आप परीक्षण करना चाहते हैं जिसमें वर्चुअल विधियां या इंटरफ़ेस लागू नहीं है

public class ServiceA{

public void A(){}

public String B(){}

}

Moq करने के लिए लपेटो

public class ServiceAWrapper : IServiceAWrapper{

public void A(){}

public String B(){}

}

रैपर इंटरफ़ेस

public interface IServiceAWrapper{

void A();

String B();

}

इकाई परीक्षण में अब आप रैपर का नकल कर सकते हैं:

    public void A_Run_ChangeStateOfX()
    {
    var moq = new Mock();
    moq.Setup(...);
    }

यह सबसे अच्छा अभ्यास नहीं हो सकता है, लेकिन यदि आपकी परियोजना के नियम आपको इस तरह से मजबूर करते हैं, तो इसे करें। अनियंत्रित रैपर या एडेप्टर के साथ प्रोजेक्ट को अधिभारित न करने के लिए केवल यूनिट टेस्ट प्रोजेक्ट या हेल्पर प्रोजेक्ट के अंदर अपने सभी लपेटें रखें

0
जोड़ा

बस किसी भी विधि को नकली करने के लिए आपको वर्चुअल (और निजी नहीं) के रूप में चिह्नित करें। फिर आप एक नकली बनाने में सक्षम होंगे जो विधि को ओवरराइड कर सकता है।

If you use new Mock and you don't have a parameterless constructor then you can pass the parameters as the arguments of the above call as it takes a type of param Objects

0
जोड़ा
इससे मुझे आश्चर्य होता है कि अगर हर वर्ग के लिए इंटरफ़ेस बनाना आवश्यक है तो मैं नकल करना चाहता हूं। अगर हम इंटरफेस नहीं रखते हैं तो क्या हम मॉकिंग के लिए कंक्रीट क्लास का उपयोग नहीं कर सकते?
जोड़ा लेखक orad, स्रोत
@seganfredo मैंने आपके पैरामीटर समस्या FYI से निपटने के लिए अपना उत्तर अपडेट किया
जोड़ा लेखक Justin Pihony, स्रोत
@orad वास्तव में, मैं पहले एक वर्ग बनाना चाहता हूं, केवल सामान्य इंटरफ़ेस को तोड़ने की आवश्यकता होने पर ही एक इंटरफ़ेस बनाना।
जोड़ा लेखक Justin Pihony, स्रोत
फिर आप निर्दिष्ट प्रकार की अपेक्षा रखने वाले ऑब्जेक्ट पर नकली कैसे पास करते हैं? यदि मैं एक नकली 'नया मॉक ' बना देता हूं और इसे MyType की अपेक्षा रखने वाली किसी ऑब्जेक्ट को पास करने का प्रयास करता हूं तो मुझे त्रुटि मिलती है "मॉक MyType में कनवर्ट नहीं किया जा सकता"।
जोड़ा लेखक Neutrino, स्रोत
मैंने इसे काम किया है, अगर आप अपने मॉक को 'var myock = new mock ()' के रूप में परिभाषित करते हैं, तो आपको इसे उस क्लास में पास करना होगा जो mock.Object के रूप में नकली का उपयोग करता है।
जोड़ा लेखक Neutrino, स्रोत

एमओक्यू के साथ, आप कंक्रीट कक्षाओं का नकल कर सकते हैं:

var mocked = new Mock();

लेकिन यह आपको वर्चुअल कोड (विधियों और गुणों) को ओवरराइड करने की अनुमति देता है।

0
जोड़ा
मैंने कोशिश की, लेकिन जब मैं अपनी टेस्ट प्रोजेक्ट चलाता हूं, तो मेरा प्रोग्राम अपवाद फेंकता है: "कक्षा के प्रॉक्सी को तत्काल नहीं कर सकता" "पैरामीटर रहित कन्स्ट्रक्टर नहीं मिला।"
जोड़ा लेखक Vinicius Seganfredo, स्रोत
आह हाँ, एक और आवश्यकता ...
जोड़ा लेखक Roy Dictus, स्रोत

मानक मॉकिंग ढांचे प्रॉक्सी कक्षाएं बना रहे हैं। यही कारण है कि वे तकनीकी रूप से इंटरफेस और आभासी तरीकों तक सीमित हैं।

यदि आप 'सामान्य' तरीकों का नकल करना चाहते हैं, तो आपको एक उपकरण की आवश्यकता है जो प्रॉक्सी पीढ़ी के बजाय उपकरण के साथ काम करता है। जैसे एमएस मोल्स और टाइपपेक ऐसा कर सकते हैं। लेकिन पूर्व में एक भयानक 'एपीआई' है, और बाद वाला वाणिज्यिक है।

0
जोड़ा

यदि आप परीक्षण के तहत कक्षा को नहीं बदल सकते हैं, तो मैं सुझाव दे सकता हूं कि एकमात्र विकल्प एमएस फॉक्स https://msdn.microsoft.com/en-us/library/hh549175.aspx । हालांकि, एमएस फॉक्स केवल विजुअल स्टूडियो के कुछ संस्करणों में काम करता है।

0
जोड़ा

मुझे लगता है कि उस वर्ग के लिए एक इंटरफ़ेस बनाना बेहतर है। और इंटरफेस का उपयोग कर एक यूनिट परीक्षण बनाएँ।

यदि आपके पास उस वर्ग तक पहुंच नहीं है, तो आप उस वर्ग के लिए एडाप्टर बना सकते हैं।

उदाहरण के लिए:

public class RealClass{
    int DoSomething(string input)
    {
       //real implementation here
    }
}

public interface IRealClassAdapter{
    int DoSomething(string input);
}

public class RealClassAdapter : IRealClassAdapter{
    private readonly RealClass _realClass;

    public RealClassAdapter(){
        _realClass = new RealClass();
    }

    int DoSomething(string input){
        _realClass.DoSomething(input);
    }
}

इस तरह, आप आसानी से IRealClassAdapter का उपयोग कर अपनी कक्षा के लिए नकली बना सकते हैं।

मुझे भरोसा है ये काम करेगा।

0
जोड़ा
रखरखाव के लिए यह भयानक है। यदि आप रीयल क्लास में एक नई विधि जोड़ना चाहते हैं, तो आपको इसे IReadClassAdapter और RealClassAdapter पर भी जोड़ना होगा। ट्रिपल प्रयास! बेहतर समाधान केवल रियल क्लास में प्रत्येक सार्वजनिक विधि में "आभासी" कीवर्ड जोड़ना है।
जोड़ा लेखक John Henckel, स्रोत
@ जॉन हेनकल मैं मान रहा हूं कि हमारे पास रीयल क्लास तक पहुंच नहीं है। तो "आभासी" विधि जोड़ना मेरी राय में एक विकल्प नहीं है। यदि आपके पास वास्तविक कक्षा तक पहुंच है तो इंटरफ़ेस को सीधे नए वर्ग में कार्यान्वित करना बेहतर है, मुझे लगता है कि यह सबसे अच्छा अभ्यास है।
जोड़ा लेखक Anang Satria, स्रोत

यदि बदतर खराब हो जाता है, तो आप एक इंटरफ़ेस और एडाप्टर जोड़ी बना सकते हैं। आप इंटरफ़ेस का उपयोग करने के लिए कंक्रीट क्लास के सभी उपयोगों को बदल देंगे, और हमेशा उत्पादन कोड में कंक्रीट क्लास के बजाय एडाप्टर को पास करेंगे।

एडाप्टर इंटरफ़ेस लागू करता है, इसलिए नकली इंटरफेस को भी कार्यान्वित कर सकता है।

यह केवल वर्चुअल वर्चुअल बनाने या इंटरफ़ेस जोड़ने की तुलना में अधिक मचान है, लेकिन अगर आपके पास कंक्रीट क्लास के स्रोत तक पहुंच नहीं है तो यह आपको बाध्य से बाहर कर सकता है।

0
जोड़ा