2012-11-16 18 views
36

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

बहुत बहुत धन्यवाद।

उत्तर

45

आप अपनी परीक्षा कक्षा में जिस कक्षा का परीक्षण कर रहे हैं उसका उत्तराधिकारी हो सकता है।

public class Test1 : SomeClass 
{ 
    Asert.AreEqual(1, SomeClass.ProtectedMethod()); 
} 
+0

अपने तेजी से उत्तर के लिए धन्यवाद युक्त विधानसभा में AssemblyInfo.cs में जोड़े। मैंने परीक्षण किया और यह काम कर रहा है। मुझे नहीं पता कि यह करने का यह एक अच्छा तरीका होगा, लेकिन कम से कम मैं इकाई परीक्षण के साथ शुरू कर सकता हूं। – fiso

+1

@unarity क्या होगा अगर मेरी टेस्टेड क्लास में कोई तर्क कन्स्ट्रक्टर नहीं है (उदा। इसमें केवल 4 तर्क निर्माता हैं)? जब मैं इससे प्राप्त होता हूं, तो मेरी टेस्ट क्लास संकलित नहीं होगी 'टेस्ट क्लास में कोई कन्स्ट्रक्टर नहीं होता है जो 0 तर्क लेता है' त्रुटि –

+1

मैं अपने यूनिट टेस्ट प्रोजेक्ट के अंदर 'टेस्टेबल' क्लास जोड़ता हूं, कक्षाओं को बढ़ाता है और उनके सभी संरक्षित तरीकों को लपेटता है 'टेस्टेबल मोड' और यदि आवश्यक हो तो कन्स्ट्रक्टर से मेल खाने वाले पुन: लागू करें। वही परिणाम लेकिन मैं कार्यान्वयन से परीक्षण अलग करना पसंद करता हूं। – Gui

3

आप निजी और संरक्षित तरीकों का आह्वान करने के लिए प्रतिबिंब का उपयोग कर सकते हैं।

अधिक के लिए यहाँ देखें:

http://msdn.microsoft.com/en-us/library/66btctbe.aspx

+5

शायद मैं गलत हूं, लेकिन मुझे लगता है कि परीक्षण के लिए प्रतिबिंब की आवश्यकता है क्योंकि मैं कुछ गलत कर रहा हूं। लेकिन अगर सी # में यह काफी सामान्य है, तो मैं इसका उपयोग करूंगा। – fiso

+0

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

+0

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

3

आप सभी निजी/संरक्षित तरीकों/क्षेत्रों तक पहुँचने के लिए PrivateObject वर्ग का उपयोग कर सकते हैं।

प्राइवेटऑब्जेक्ट माइक्रोसॉफ्ट यूनिट परीक्षण ढांचे में एक वर्ग है जो एक रैपर है जो सामान्य रूप से यूनिट परीक्षण के लिए पहुंचने योग्य सदस्यों को कॉल करने में सक्षम बनाता है।

+4

यह उत्तर बहुत लाभान्वित होगा अगर यह समझाया गया कि एक निजी ऑब्जेक्ट क्या है। –

+0

यह बहुत आसान है, बस प्रलेखन https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privateobject.aspx पर जाएं –

2

आप उस कक्षा को संरक्षित विधियों का पर्दाफाश कर सकते हैं जो उस कक्षा को प्राप्त करता है जिसे आप परीक्षण करना चाहते हैं।

public class ExposedClassToTest : ClassToTest 
{ 
    public bool ExposedProtectedMethod(int parameter) 
    { 
     return base.ProtectedMethod(parameter); 
    } 
} 
5

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

यह आपको उतना ही encapsulation और संरक्षण नहीं देता है, लेकिन यह काफी सीधे आगे है और उपयोगी हो सकता है।

आंतरिक तरीकों

[assembly: InternalsVisibleTo("TestsAssembly")]