2009-03-15 11 views
5

जैसे ही मैं कोड विकसित करता हूं, मैं अक्सर कक्षा के कुछ बिल्डिंग ब्लॉक का परीक्षण करना चाहता हूं, भले ही वे सामान्य रूप से निजी हों। यदि मेरे यूनिट परीक्षण परियोजना के अंदर हैं, तो मैं इसे पूरा करने के लिए "मित्र" का उपयोग कर सकता हूं और अभी भी सामान्य उपयोग के लिए कार्यों को निजी रख सकता हूं। लेकिन मैं अपने एनयूनीट परीक्षणों को अपनी अलग परियोजनाओं में ले जाऊंगा। मैं जिस प्रभाव को ढूंढ रहा हूं उसे मैं कैसे प्राप्त करूं?मैं वीबी .NET में एक अलग परियोजना से निजी कार्यों का परीक्षण कैसे करूं?

उत्तर

11

आप (आसानी से) परीक्षण निजी एक परीक्षण परियोजना से एक अलग परियोजना से तरीकों, लेकिन यह काफी आंतरिक तरीकों का परीक्षण करने के लिए आम है (VB में Friend) InternalsVisibleToAttribute का उपयोग नहीं कर सकते हैं। यह Friend सदस्यों को किसी अन्य असेंबली के लिए सुलभ बनाता है।

स्पष्ट रूप से यह वीबी 9 में नया था हालांकि यह सी # 2 में उपलब्ध था ... बिल्कुल यकीन नहीं है, लेकिन this blog post from Bart de Smet एक त्वरित उदाहरण देता है।

ध्यान दें कि यदि आपकी उत्पादन असेंबली पर हस्ताक्षर किए गए हैं, तो आपकी टेस्ट असेंबली पर भी हस्ताक्षर करने की आवश्यकता होगी, और आपको InternalsVisibleToAttribute तर्कों में सार्वजनिक कुंजी निर्दिष्ट करनी होगी। अधिक जानकारी के लिए this Stack Overflow answer देखें।

+2

कारण है कि यह VB9 में नया था के रूप में (यह ऊपर लिंक कोड परियोजना साइट से चिपकाया जाता है), यह था एक लागत/लाभ व्यापार बंद करो। वीबी के नामों को हल करने का एक बहुत ही अलग तरीका है और आंतरिक दृश्यमान बहुत अधिक नाम लुकअप को जटिल बनाता है। यह वीबी 8 के लिए बहुत महंगा था और इसलिए वीबी 9 में गिर गया। हम वास्तव में वीबी 10 में इस संदर्भ के लिए नाम संकल्प (cont) – JaredPar

+0

(cont) खाते के आसपास और परिवर्तन कर रहे हैं। – JaredPar

+0

इस उत्तर के लिए धन्यवाद –

3

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

+0

और यह वह है जिसने मुझे सबसे ज्यादा मदद की: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx – demoncodemonkey

1
एक त्वरित गूगल खोज से

: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

मूल बातें

:

 public static object RunStaticMethod(System.Type t, string strMethod, 
    object [] objParams) 
    { 
     BindingFlags eFlags = 
     BindingFlags.Static | BindingFlags.Public | 
     BindingFlags.NonPublic; 
     return RunMethod(t, strMethod, 
     null, aobjParams, eFlags); 
    } //end of method 

    public static object RunInstanceMethod(System.Type t, string strMethod, 
    object objInstance, object [] aobjParams) 
    { 
     BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public | 
     BindingFlags.NonPublic; 
     return RunMethod(t, strMethod, 
     objInstance, aobjParams, eFlags); 
    } //end of method 

    private static object RunMethod(System.Type t, string 
    strMethod, object objInstance, object [] aobjParams, BindingFlags eFlags) 
    { 
     MethodInfo m; 
     try 
     { 
      m = t.GetMethod(strMethod, eFlags); 
      if (m == null) 
      { 
       throw new ArgumentException("There is no method '" + 
        strMethod + "' for type '" + t.ToString() + "'."); 
      } 

      object objRet = m.Invoke(objInstance, aobjParams); 
      return objRet; 
     } 
     catch 
     { 
      throw; 
     } 
    } //end of method 
संबंधित मुद्दे