मैं असेंबली (यूनिट परीक्षण एक) को किसी अन्य विधानसभा के आंतरिक गुणों तक पहुंचने की अनुमति कैसे दूं?


80

मैं चाहूंगा कि मेरी कोर असेंबली एक निश्चित वर्ग को उजागर न करे और मैं अभी भी इसका परीक्षण करने में सक्षम होना चाहूंगा। मैं उसे कैसे कर सकता हूँ ?

जवाबों:


107

बचाव के लिए InternalsVoubleTo विशेषता!

बस जोड़ दो:

[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]

अपनी मूल कक्षाओं के लिए विधानसभाInfo.cs फ़ाइल

सर्वोत्तम अभ्यासों के लिए मित्र असेम्बली (C # प्रोग्रामिंग गाइड) देखें ।


3
मैंने अभी हाल ही में एक मजबूत नामित विधानसभा के साथ सफलतापूर्वक किया, जो कि एकु के मार्गदर्शन से जुड़ा था। हालांकि मेरे पास एक मुद्दा था। सब कुछ कॉन्फ़िगर होने के बाद मुझे काम करने के लिए Intellisense के लिए Visual Studio को पुनरारंभ करना पड़ा। यह पुनः आरंभ करने से पहले संकलित करेगा लेकिन हमेशा लाल रेखाओं को प्रदर्शित करेगा।
एरिक शूनओवर

20

InternalsVisible अगर आपके विधानसभाओं दृढ़ता से नाम हैं के साथ आप सार्वजनिक कुंजी (ध्यान दें: पूर्ण कुंजी निर्दिष्ट करने की आवश्यकता नहीं सार्वजनिक कुंजी टोकन) उदाहरण के लिए ...

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BoardEx_BusinessObjects.Tests, 
  PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb3a2d8 etc etc")]

और सीएमडी लाइन का सहारा लिए बिना सार्वजनिक चाल प्राप्त करने के लिए निम्नलिखित चाल वास्तव में उपयोगी है ...

http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx


9

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

मैंने इस दृष्टिकोण पर कुछ आपत्तियाँ सुनी हैं, लेकिन उनमें से कुछ आश्वस्त हैं।

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

यह एक सुरक्षा जोखिम है । केवल तभी जब आपके परीक्षणों में रहस्य हों। ऐसा मत करो।

अब, आपकी स्थिति मेरी से अलग है, इसलिए शायद यह आपके लिए समझ में आएगा, और शायद यह नहीं होगा। आपको खुद पता लगाना होगा।

एक तरफ: सी # में, मैंने एक बार "टेस्ट" नाम की एक कक्षा में अपनी इकाई परीक्षण डालने की कोशिश की थी जिसे उस कक्षा के अंदर घोंसला बनाया गया था जो यह परीक्षण कर रहा था। इससे चीजों का सही संगठन स्पष्ट हो गया। यह उन नामों के दोहराव से भी बचता है जो तब होता है जब कक्षा "फू" के लिए परीक्षण "फूस्ट्स" नामक एक वर्ग में होते हैं। हालाँकि, यूनिट परीक्षण रूपरेखा जिनके पास मेरे पास "सार्वजनिक" चिह्नित किए गए परीक्षण स्वीकार करने से इनकार करने की पहुंच थी। इसका मतलब है कि जिस वर्ग का आप परीक्षण कर रहे हैं वह "निजी" नहीं हो सकता है। मैं "सार्वजनिक" होने के लिए परीक्षणों की आवश्यकता के लिए किसी भी अच्छे कारण के बारे में नहीं सोच सकता, क्योंकि कोई भी वास्तव में उन्हें सार्वजनिक तरीकों के रूप में नहीं बुलाता है - सब कुछ प्रतिबिंब के माध्यम से है। यदि आप कभी भी .Net के लिए एक इकाई परीक्षण रूपरेखा लिखते हैं, तो कृपया मेरे लिए, गैर-सार्वजनिक परीक्षणों की अनुमति देने पर विचार करें!


5
दिलचस्प दृष्टिकोण। और मैं परीक्षणों के सार्वजनिक होने के बारे में पूरी तरह सहमत हूं। मूर्खतापूर्ण आवश्यकता, आई.एम.ओ.
किलाहोफर

@ किल्होफर: मैं वर्षों से इस बारे में शिकायत कर रहा हूं, और आप वास्तव में मेरे साथ सहमत होने वाले पहले व्यक्ति हैं। धन्यवाद!
जय बज्जुइ

6
यदि आप [Conditional("DEBUG")]परीक्षण कक्षाओं में उपयोग करते हैं तो उन्हें उत्पादन विधानसभा में नहीं होना चाहिए और प्रदर्शन को नुकसान नहीं पहुंचाना चाहिए।
xmedeko

3

मेरा सुझाव है कि इस तरह की परेशानियों को नहीं जाना चाहिए ... यदि आप वास्तव में अपनी "आंतरिक" कक्षाओं का परीक्षण करना चाहते हैं, तो उन्हें केवल एक नेमस्पेस में छिपा दें जो केवल आपके आंतरिक कोड का उपयोग करके समाप्त हो जाएगा। जब तक आप .NET फ्रेमवर्क के पैमाने पर एक रूपरेखा नहीं लिख रहे हैं, तब तक आपको वास्तव में उस स्तर को छिपाने की आवश्यकता नहीं है ।


जब मैं आपकी टिप्पणी पर ध्यान देता हूं, तो मैं ठीक-ठीक टिप्पणी करने जा रहा हूं। +1! :)
ब्योर्न रेपेन

2

आप प्रतिबिंब का उपयोग कर सकते हैं (जैसा कि एमएस टेस्ट आइटम करते हैं), या आप यूनिट टेस्ट असेंबली को कोर असेंबली का मित्र घोषित कर सकते हैं।

दूसरा विकल्प इकाई परीक्षणों को एक ही विधानसभा में रखना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.