2010-06-14 20 views
6

का परीक्षण करने में सहायता के लिए उपयोग की जाने वाली सार्वजनिक विधि को छुपाएं मेरे पास रिलीज़ होने के लिए एक .NET असेंबली है। अपनी रिहाई के निर्माण में शामिल हैं:.NET असेंबली

  • एक सार्वजनिक, विधियों जो लोग अन्य तरीकों, जो केवल मदद करने के लिए विधानसभा का परीक्षण में मौजूद
  • एक सार्वजनिक लेकिन गैर-दस्तावेजी एपीआई का उपयोग करने की अपेक्षा की जाती के दस्तावेज एपीआई, और जो लोग

जारी करने वाली असेंबली एक कस्टम नियंत्रण है, न कि एक आवेदन। इसे पुन: परीक्षण करने के लिए, मैं इसे एक परीक्षण ढांचे/अनुप्रयोग में चलाता हूं, जो नियंत्रण (सार्वजनिक/दस्तावेज एपीआई के अतिरिक्त) कुछ उन्नत/अनियंत्रित विधियों का उपयोग करता है जिन्हें नियंत्रण से निर्यात किया जाता है।

इस तरह सार्वजनिक तरीकों जो मैं लोगों को उपयोग करने के लिए, मैं उन्हें प्रलेखन <exclude> टैग (सैंडकैसल मदद फ़ाइल बिल्डर द्वारा समर्थित) का उपयोग कर से बाहर रखा नहीं करना चाहते, और [EditorBrowsable] विशेषता, उदाहरण के लिए के लिए:

/// <summary> 
/// Gets a <see cref="IEditorTransaction"/> instance, which helps 
/// to combine several DOM edits into a single transaction, which 
/// can be undone and redone as if they were a single, atomic operation. 
/// </summary> 
/// <returns>A <see cref="IEditorTransaction"/> instance.</returns> 
IEditorTransaction createEditorTransaction(); 

/// <exclude/> 
[EditorBrowsable(EditorBrowsableState.Never)] 
void debugDumpBlocks(TextWriter output); 

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

// Summary: 
//  Gets a ModelText.ModelDom.Nodes.IEditorTransaction instance, which helps 
//  to combine several DOM edits into a single transaction, which can be undone 
//  and redone as if they were a single, atomic operation. 
// 
// Returns: 
//  A ModelText.ModelDom.Nodes.IEditorTransaction instance. 
IEditorTransaction createEditorTransaction(); 
// 
[EditorBrowsable(EditorBrowsableState.Never)] 
void debugDumpBlocks(TextWriter output); 

सवाल:

  • वहाँ एक रास्ता एक सार्वजनिक विधि को छिपाने के लिए है, मेटा डेटा से भी?
  • यदि नहीं, तो इसके बजाय, इस परिदृश्य के लिए, क्या आप internal विधियों को बनाने और InternalsVisibleTo विशेषता का उपयोग करने की सलाह देंगे? या आप किसी अन्य तरीके की सिफारिश करेंगे, और यदि ऐसा है तो क्यों और क्यों?

धन्यवाद।

+5

मैं एक उचित डिज़ाइन की अनुशंसा करता हूं जिसके लिए आपको सार्वजनिक रूप से उस कोड को बेनकाब करने की आवश्यकता नहीं है जिसे आप छुपाएंगे। –

+0

मार्क के साथ सहमत हुए। आपको अपने सार्वजनिक इंटरफेस के माध्यम से "छुपा" सार्वजनिक तरीकों और/या आंतरिक बनाने के बिना अपने सभी कोड का परीक्षण करने में सक्षम होना चाहिए। –

+0

@ मार्क मैं [सार्वजनिक इंटरफेस के माध्यम से कोड का परीक्षण कर रहा हूं] (http://stackoverflow.com/questions/856115), हालांकि रिग्रेशन-टेस्ट में मदद करने के लिए मेरे पास कुछ अतिरिक्त विधियां हैं, उदा। जो नियंत्रण की आंतरिक स्थिति को डंप करता है: ताकि परीक्षण केस विभिन्न (सार्वजनिक, दस्तावेज) इनपुट घटनाओं के बाद (अनियंत्रित) आंतरिक स्थिति पर जोर दे सके। – ChrisW

उत्तर

0

दो संभावनाएं InternalsVisibleTo, और/या प्रतिबिंब हैं। मुझे इस विचार पर किसी को पसंद करने के किसी भी मजबूत कारण से अवगत नहीं है।

6

internal/InternalsVisibleTo एक अच्छा दृष्टिकोण है, लेकिन यह अभी भी संकलित कोड में विधियों को उत्पन्न करता है और वे प्रतिबिंब के माध्यम से उपलब्ध होंगे।

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

+0

+1 ने अतीत में इस तरह के प्रतीकों का इस्तेमाल किया, अब तक जाने का सबसे आसान तरीका है। –

+0

मुझे प्रतिबिंब का उपयोग कर हैकर्स के बारे में कोई फर्क नहीं पड़ता; मैं सिर्फ नियंत्रण के सामान्य उपभोक्ताओं को अनियंत्रित तरीकों को देखने के लिए नहीं चाहता हूं। इसके अलावा, सशर्त संकलन काम नहीं करेगा क्योंकि मैं [रिलीज संस्करण का परीक्षण] (http://stackoverflow.com/questions/420343)। – ChrisW

+0

यदि आप एक और कॉन्फ़िगरेशन बनाते हैं जो अतिरिक्त विधियों के द्वारा रिलीज़ संस्करण से अलग है, तो यह वही होता है। अन्य प्रतीकों को परिभाषित करने के लिए आपको डीबग कॉन्फ़िगरेशन में होने की आवश्यकता नहीं है। – CMerat

0

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

+0

यह देखते हुए कि मैं सशर्त संकलन का उपयोग नहीं करूंगा क्योंकि मैं [रिलीज बिल्ड का परीक्षण करना चाहता हूं] (http://stackoverflow.com/questions/420343), क्या आप जानते हैं कि प्रतिबिंब का उपयोग करना बेहतर होगा या ' InternalsVisibleTo' विशेषता? – ChrisW

+0

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

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