मैं चाहूंगा कि मेरी कोर असेंबली एक निश्चित वर्ग को उजागर न करे और मैं अभी भी इसका परीक्षण करने में सक्षम होना चाहूंगा। मैं उसे कैसे कर सकता हूँ ?
मैं चाहूंगा कि मेरी कोर असेंबली एक निश्चित वर्ग को उजागर न करे और मैं अभी भी इसका परीक्षण करने में सक्षम होना चाहूंगा। मैं उसे कैसे कर सकता हूँ ?
जवाबों:
बचाव के लिए InternalsVoubleTo विशेषता!
बस जोड़ दो:
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
अपनी मूल कक्षाओं के लिए विधानसभाInfo.cs फ़ाइल
सर्वोत्तम अभ्यासों के लिए मित्र असेम्बली (C # प्रोग्रामिंग गाइड) देखें ।
InternalsVisible अगर आपके विधानसभाओं दृढ़ता से नाम हैं के साथ आप सार्वजनिक कुंजी (ध्यान दें: पूर्ण कुंजी निर्दिष्ट करने की आवश्यकता नहीं सार्वजनिक कुंजी टोकन) उदाहरण के लिए ...
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BoardEx_BusinessObjects.Tests,
PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb3a2d8 etc etc")]
और सीएमडी लाइन का सहारा लिए बिना सार्वजनिक चाल प्राप्त करने के लिए निम्नलिखित चाल वास्तव में उपयोगी है ...
http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx
मैंने अपनी इकाई परीक्षण को उसी विधानसभा में रखा जिस कोड का वह परीक्षण कर रहा है। यह मेरे लिए समझ में आता है, क्योंकि मुझे लगता है कि "खुद को परखें" एक वर्ग की विशेषता के रूप में, "खुद को इनिशियलाइज़" और "खुद का वर्णन" जैसी चीजों के साथ।
मैंने इस दृष्टिकोण पर कुछ आपत्तियाँ सुनी हैं, लेकिन उनमें से कुछ आश्वस्त हैं।
यह प्रदर्शन दर्द होता है बाह, मैं कहता हूं! हार्ड डेटा के बिना अनुकूलन मत करो! शायद यदि आप अपनी विधानसभाओं को धीमी लिंक पर डाउनलोड करने की योजना बना रहे हैं, तो विधानसभा का आकार कम से कम करना उचित होगा।
यह एक सुरक्षा जोखिम है । केवल तभी जब आपके परीक्षणों में रहस्य हों। ऐसा मत करो।
अब, आपकी स्थिति मेरी से अलग है, इसलिए शायद यह आपके लिए समझ में आएगा, और शायद यह नहीं होगा। आपको खुद पता लगाना होगा।
एक तरफ: सी # में, मैंने एक बार "टेस्ट" नाम की एक कक्षा में अपनी इकाई परीक्षण डालने की कोशिश की थी जिसे उस कक्षा के अंदर घोंसला बनाया गया था जो यह परीक्षण कर रहा था। इससे चीजों का सही संगठन स्पष्ट हो गया। यह उन नामों के दोहराव से भी बचता है जो तब होता है जब कक्षा "फू" के लिए परीक्षण "फूस्ट्स" नामक एक वर्ग में होते हैं। हालाँकि, यूनिट परीक्षण रूपरेखा जिनके पास मेरे पास "सार्वजनिक" चिह्नित किए गए परीक्षण स्वीकार करने से इनकार करने की पहुंच थी। इसका मतलब है कि जिस वर्ग का आप परीक्षण कर रहे हैं वह "निजी" नहीं हो सकता है। मैं "सार्वजनिक" होने के लिए परीक्षणों की आवश्यकता के लिए किसी भी अच्छे कारण के बारे में नहीं सोच सकता, क्योंकि कोई भी वास्तव में उन्हें सार्वजनिक तरीकों के रूप में नहीं बुलाता है - सब कुछ प्रतिबिंब के माध्यम से है। यदि आप कभी भी .Net के लिए एक इकाई परीक्षण रूपरेखा लिखते हैं, तो कृपया मेरे लिए, गैर-सार्वजनिक परीक्षणों की अनुमति देने पर विचार करें!
[Conditional("DEBUG")]परीक्षण कक्षाओं में उपयोग करते हैं तो उन्हें उत्पादन विधानसभा में नहीं होना चाहिए और प्रदर्शन को नुकसान नहीं पहुंचाना चाहिए।
मेरा सुझाव है कि इस तरह की परेशानियों को नहीं जाना चाहिए ... यदि आप वास्तव में अपनी "आंतरिक" कक्षाओं का परीक्षण करना चाहते हैं, तो उन्हें केवल एक नेमस्पेस में छिपा दें जो केवल आपके आंतरिक कोड का उपयोग करके समाप्त हो जाएगा। जब तक आप .NET फ्रेमवर्क के पैमाने पर एक रूपरेखा नहीं लिख रहे हैं, तब तक आपको वास्तव में उस स्तर को छिपाने की आवश्यकता नहीं है ।
आप प्रतिबिंब का उपयोग कर सकते हैं (जैसा कि एमएस टेस्ट आइटम करते हैं), या आप यूनिट टेस्ट असेंबली को कोर असेंबली का मित्र घोषित कर सकते हैं।
दूसरा विकल्प इकाई परीक्षणों को एक ही विधानसभा में रखना है।