2013-04-05 9 views
5

मेरे पास एक सार्वजनिक वर्ग (TargetContainerDto) है जिसमें 2 आंतरिक गुण हैं। एक enum और एक प्रकार जिसमें उस enum से एक मूल्य शामिल है।इकाई परीक्षण आंतरिक गुणों के लिए प्रतिबिंब

मैं इकाई का परीक्षण करने की कोशिश कर रहा हूं, लेकिन मुझे समस्याएं आ रही हैं।

internal enum TargetContainerType 
{ 
    Endpoint, 
    Group, 
    User, 
    UserGroup 
} 


internal TargetContainerType Type { get; set; } 

यह मेरा परीक्षण वर्ग

public void setType(TargetContainerDto t, int val) 
{ 
    BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance; 
    PropertyInfo pi = t.GetType().GetProperty("Type", bf); 
    pi.SetValue(t, val, null); 
} 

public TargetContainerDto setTypeTo(TargetContainerDto t, int val) 
{ 
    setType(t, val); 
    return t; 
} 

TargetContainerDto प्रकार की तुलना में अधिक गुण है में अपने प्रतिबिंब कोड है, लेकिन वे सार्वजनिक कर रहे हैं ताकि परीक्षण उन्हें ठीक है। iconURL टाइपिंग के आधार पर TargetContainerDto में परिभाषित एक स्ट्रिंग है।

public void DefaultSubGroupIcon() 
{ 
    var o1 = new TargetContainerDto 
    { 
     Id = 1234, 
     DistinguishedName = "1.1.1.1", 
     SubGroup = "test", 
    }; 
    setType(o1, 3); 
    Assert.AreEqual(o1.IconUrl, "/App_Themes/Common/AppControl/Images/workstation1.png"); 
} 

मैं परीक्षा पद्धति में setTypeTo फोन जब मैं typevalue निर्धारित करने की आवश्यकता है, लेकिन मैं एक MethodAccessException हो रही है: यहाँ मेरी Testmethod है। मुझे लगता है कि ऐसा इसलिए है क्योंकि मुझे enum तक पहुंच नहीं है। मैं प्रतिबिंब के माध्यम से enum कैसे उपयोग कर सकते हैं?

धन्यवाद

+3

बस उत्सुक - क्या आपने कभी परीक्षणों के तहत आंतरिक स्थिति की पहुंच के लिए परीक्षणों में रिफ्लेक्सियन का उपयोग करके स्टॉप पर विचार किया है और अपने आवेदन को फिर से डिजाइन किया है? –

+0

क्या आप अपवाद पोस्ट कर सकते हैं? क्या टाइप के पास पहले एक मान सेट है या यह शून्य है? – Akku

+0

वैसे, मैंने अभी आपके परिदृश्य का परीक्षण किया है और यह अच्छी तरह से काम करता है। क्या आप कृपया अधिक विवरण प्रदान कर सकते हैं, न केवल अपवाद विवरण, बल्कि आपके ** TargetContainerDto ** कक्षा परिभाषा? इसके लिए बेस क्लास क्या है? –

उत्तर

1

मैं अन्य टिप्पणी है कि आप आंतरिक स्थिति का परीक्षण कर से बचने के लिए नया स्वरूप की कोशिश करनी चाहिए के साथ सहमत में वर्णित तरीके की जोड़ी, तथापि मैंने किया अपना कोड आज़माएं और यह मेरे लिए ठीक काम करता है (वीएस2012 पर नेट 4)। परीक्षण के अंतर्गत

मेरे वर्ग पुस्तकालय इस तरह दिखता है:

using System; 

namespace ClassLibrary 
{ 
    internal enum TargetContainerType 
    { 
     Endpoint, 
     Group, 
     User, 
     UserGroup 
    } 

    public class TargetContainerDto 
    { 
     internal TargetContainerType Type 
     { 
      get; 
      set; 
     } 

     public void Print() 
     { 
      Console.WriteLine(Type); 
     } 
    } 
} 

और परीक्षण कार्यक्रम (एक कंसोल अनुप्रयोग) इस तरह दिखता है:

using System; 
using System.Reflection; 
using ClassLibrary; 

namespace Demo 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var test = new TargetContainerDto(); 
      setType(test, 1); 
      test.Print(); 
     } 

     public static void setType(TargetContainerDto t, int val) 
     { 
      BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance; 
      PropertyInfo pi = t.GetType().GetProperty("Type", bf); 
      pi.SetValue(t, val, null); 
     } 
    } 
} 

यह Group बाहर प्रिंट, अपेक्षा के अनुरूप। यदि हम इस और आपके वास्तविक कोड के बीच अंतर की पहचान कर सकते हैं, तो हम समस्या को ढूंढने में सक्षम हो सकते हैं।

+0

हाय, मदद के लिए धन्यवाद। एकमात्र अंतर जो मैं देख सकता हूं वह यह है कि आपके पास लक्ष्यकंटनर डॉट क्लास के बाहर घोषित आंतरिक enum है। इसके अलावा मेरा टेस्ट ऐप एक यूनिट टेस्ट है लेकिन अभी भी समान व्यवहार करना चाहिए। – user966890

+0

जब मैंने setTypeTo विधि से छुटकारा पा लिया तो यह मेरे लिए काम करता था। बहुत बहुत धन्यवाद। Il आपको जवाब के रूप में चिह्नित करता है क्योंकि आप केवल एक ही हैं जिन्होंने प्रतिबिंब के प्रति वास्तविकता में जवाब दिया और वैकल्पिक रूप से नहीं। धन्यवाद – user966890

7

मार्क InternalsVisibleTo विशेषता के साथ अपने विधानसभा और आप अपने परीक्षण dll में प्रतिबिंब का उपयोग करने की जरूरत नहीं है।

उदा

[assembly:InternalsVisibleTo("TestAssembly")] 

अधिक जानकारी के लिए here देखें: अपने आवेदन में AssemblyInfo.cs फ़ाइल में निम्नलिखित पंक्ति जोड़ DLL।

+4

ध्यान रखें कि ऐसा करने से कोड विश्लेषण को अप्रयुक्त आंतरिकों का पता लगाने से रोका जाएगा। –

6

आप गलत सवाल पूछ रहे हैं। एक बेहतर सवाल होगा:

कैसे मैं कक्षा की आंतरिक स्थिति का परीक्षण रोकूँ?

लेकिन, यदि आप पूरी तरह से इस की जरूरत है, वहाँ इस प्रासंगिक SO answer

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