2009-07-31 13 views
16

मैं विजुअल-स्टूडियो 2008 के तरीके से यूनिट-परीक्षण में कूद रहा हूं, और मुझे आश्चर्य है कि परीक्षण उद्देश्यों के लिए क्रॉस-असेंबली class पहुंच को पूरा करने का सबसे अच्छा तरीका क्या है।यूनिट-परीक्षण उद्देश्यों के लिए किसी अन्य असेंबली में कक्षाओं का उपयोग कैसे करें?

मूल रूप से, मैं एक समाधान में दो परियोजनाएं हैं:

  1. MyProject (सी #)
  2. MyProjectTests (सी # टेस्ट परियोजना)

MyProject में सब कुछ वर्तमान में डिफ़ॉल्ट पहुंच है, जो अगर मैं सही ढंग से याद रखें मतलब सब कुछ प्रभावी ढंग से internal है। मैं ज्यादातर class स्तर पर परीक्षण करना चाहता हूं, लेकिन इसमें कुछ delegates शामिल हैं।

शायद भविष्य में कभी-कभी बाहरी एपीआई होगा, लेकिन मैं पूरा करने के लिए लगभग 20% तरीका (कम से कम कागज़ पर) हूं और मुझे इसके ऊपर अधिक कोड ले जाने की बहुत अच्छी लग रही है अवांछित कोर तदनुसार मैं कुछ परीक्षण करना चाहता हूं, इससे पहले कि ऐप पारंपरिक (पढ़ने: खराब और/या आलसी) कार्यात्मक परीक्षण के लिए पर्याप्त हो और संस्करण एन + 1 बाहरी एपीआई पहले से पहले हो।

सीधे उत्तर के अलावा, समाधान का एक उदाहरण बहुत सराहना की जाएगी।

+1

की तरह एक परीक्षण ढांचे का प्रयोग कर अपने अगले प्रश्न को रोकने के लिए - क्यों परीक्षण विधानसभा यदि परीक्षण किया विधानसभा हस्ताक्षरित किया गया है पर हस्ताक्षर किया जाना है? - यहां इस विषय पर मेरा आलेख है: http://blogs.msdn.com/ericlippert/archive/2009/06/04/alas-smith-and-jones.aspx –

उत्तर

28

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

अपने MyProject विधानसभा में

[assembly:InternalsVisibleTo("MyProjectTests")] 
AssemblyInfo.cs को

जोड़ें।

+0

उपयुक्त मजबूत-नाम कुंजी संदर्भ के साथ, निश्चित रूप से शामिल है - आप अपने असेंबली का नामकरण कर रहे हैं, आप नहीं हैं। –

3

आप अपने "MyProject (सी #)" की AssemblyInfo.cs को

[assembly:InternalsVisibleTo("Unit.Tests.Assembly")] 

जोड़ने की जरूरत है। उसके बाद आपके परीक्षणों को परीक्षण के लिए आंतरिक तरीकों तक पहुंचने की अनुमति मिलती है।

+2

टूटी हुई लिंक कृपया – Darcy

1

ऐसा लगता है कि InternalsVisibleToAttribute

जरूरत है हालांकि मैं इस दृष्टिकोण के खिलाफ की सलाह देते हैं - सार्वजनिक इंटरफ़ेस या API के माध्यम से अपने आंतरिक कक्षाओं का परीक्षण करें।

+0

को ठीक करें समस्या यह है कि वे अभी तक मौजूद नहीं हैं; और थोड़ी देर के लिए नहीं होगा। इसकी एक बड़ी परियोजना (या, यह पूरा होने पर होगा)। –

+0

अंदरूनी दृष्टिकोण के साथ समस्या यह है कि आप ऐसी परिस्थिति में भाग ले सकते हैं जहां आपके पास आंतरिक है .. लेकिन बाहरी एपीआई अपेक्षित रूप से प्लग नहीं करता है - क्योंकि समझ में डिस्कनेक्ट था। फीडबैक बहुत बाद में आता है .. जब इसे सुधारना अधिक महंगा होता है। – Gishu

+0

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

3

आप, आंतरिक तरीकों का परीक्षण कर सकते हैं अपने मुख्य परियोजना के लिए AssemblyInfo.cs को एक विशेषता जोड़ने, एक नामित विधानसभा के लिए आंतरिक तरीकों का उपयोग करने देने से:

[विधानसभा: InternalsVisibleTo ("MyProjectTestsNameSpace।MyProjectTests ")]

आगे की जानकारी here

+0

लिंक टूटा हुआ है :( – User193452

0

है हालांकि [InternalsVisibleTo] सबसे समझदार रास्ता IMO है, वहाँ इस बारे में जाने के लिए कम से कम 2 अन्य तरीके हैं:

  • Reflection

    var method = instance.GetType().GetMethod(
        methodName, BindingFlags.NonPublic | BindingFlags.Instance, 
        null, paramTypeArray, null); 
    return method.Invoke(instance, parameters); 
    
    का उपयोग करके

समस्या यह दृष्टिकोण यह है कि यदि विधि का नाम या हस्ताक्षर बदलता है, तो इकाई परीक्षण रन टाइम पर असफल हो जाएगा, जबकि [InternalsVisibleTo] संकलन समय पर इस ब्रेकिंग परिवर्तन को आसानी से उठाया जाएगा।

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

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