2011-01-10 6 views
7

सी # का उपयोग कर एमएसटेस्ट के साथ कक्षा विशेषताओं और विधि विशेषताओं की उपस्थिति का परीक्षण कैसे करें?सी # का उपयोग कर एमएसटेस्ट के साथ इकाई परीक्षण विशेषताओं को कैसे करें?

+1

यह overkill की तरह लगता है। आप बस स्रोत कोड का निरीक्षण कर सकते हैं। – jason

+3

असल में इस तरह की चीज रिफैक्टरिंग ब्लंडर्स को पकड़ने के लिए काफी अच्छी है। यह सुनिश्चित करना कि गुणों पर निर्भर कोड अच्छी तरह से परीक्षण किया जाता है (और सभ्य त्रुटि संदेश देता है) भी महत्वपूर्ण है। –

+0

और टीडीडी –

उत्तर

8

C# Extension method for checking attributes

public static bool HasAttribute<TAttribute>(this MemberInfo member) 
    where TAttribute : Attribute 
{ 
    var attributes = 
     member.GetCustomAttributes(typeof(TAttribute), true); 

    return attributes.Length > 0; 
} 
+0

स्पॉट पर और ऊपर दिए गए मेरे उत्तर में पूरक किया जा सकता है। मैं बस यह कर सकता हूँ। बहुत अधिक सुरुचिपूर्ण। – dove

+0

दिमाग अगर मैं आपके उत्तर में विचार जोड़ता हूं? – dove

+0

@dove: निश्चित रूप से, इस पर है। –

4

प्रतिबिंब का उपयोग करें, उदाहरण के लिए यहां नुनिट + सी # में एक है, जिसे आसानी से एमएसटेस्ट में अनुकूलित किया जा सकता है।

[Test] 
public void AllOurPocosNeedToBeSerializable() 
{ 
    Assembly assembly = Assembly.GetAssembly(typeof (PutInPocoElementHere)); 
    int failingTypes = 0; 
    foreach (var type in assembly.GetTypes()) 
    { 
    if(type.IsSubclassOf(typeof(Entity))) 
    { 
     if (!(type.HasAttribute<SerializableAttribute>())) failingTypes++; 
     Console.WriteLine(type.Name); 
     //whole test would be more concise with an assert within loop but my way 
     //you get all failing types printed with one run of the test. 
    } 
    } 
    Assert.That(failingTypes, Is.EqualTo(0), string.Format("Look at console output 
    for other types that need to be serializable. {0} in total ", failingTypes)); 
} 

//refer to Robert's answer below for improved attribute check, HasAttribute 
+0

कुछ काम के साथ, मुझे लगता है कि आप 'IsTypeSerializable' को एक सामान्य विधि बना सकते हैं जो किसी भी विशेषता को संभाल सकता है। –

+0

@Robert, बिल्कुल, यह System.Type पर एक एक्सटेंशन के रूप में भी बेहतर पढ़ सकता है, जिसमें मैं इसे – dove

+0

@Robert के बिल्ली के लिए शामिल कर सकता हूं, उसके साथ थोड़ा खिलौना था और यह काफी कामयाब था लेकिन लगता है कि यह केवल अव्यवस्था का जवाब होगा ऊपर। मेरा जवाब कंसोल पर असफल प्रकारों को ध्यान में रखते हुए, दिमाग में परीक्षण के साथ बहुत निश्चित है। एक्सटेंशन विधि में हस्ताक्षर हो सकते हैं जैसे: सार्वजनिक स्थैतिक बूल IsTypeSerializeable (यह सिस्टम। टाइप प्रकार, सिस्टम। टाइप चेक टाइप) // हालांकि आप दूसरे पैरामीटर के रूप में केवल एक विशेषता प्राप्त करना चाहते हैं, मुझे थोड़ा और काम चाहिए जो मैं चाहता हूं केवल तभी करें जब इसे बुलाया जाए। ठीक है, मैं इसे डाल दूंगा;) – dove

1

खुद के दो सहायक कार्य (प्रतिबिंब का उपयोग) लिखें इन पंक्तियों के साथ:

public static bool HasAttribute(TypeInfo info, Type attributeType) 
public static bool HasAttribute(TypeInfo info, string methodName, Type attributeType) 

तो फिर तुम इस तरह परीक्षण लिख सकते हैं:

Assert.IsTrue(HasAttribute(myType, expectedAttribute)); 

इस तरह से आप की जरूरत नहीं है यदि आपके परीक्षण विधियों में/else/foreach या अन्य तर्क का उपयोग करें। इस प्रकार वे कहीं अधिक स्पष्ट और पठनीय हो जाते हैं।

HTH
थॉमस

+0

के लिए परीक्षण के एकाधिक पुन: रनों को सहेजने के लिए सभी असफल इकाई को कंसोल करने के लिए आउटपुट किया गया है, आपके पास एक बिंदु है लेकिन मेरा परीक्षण (और अन्य जिन्हें मैंने यहां नहीं रखा है) यह है कि एक टेस्ट रन के साथ आपको कंसोल पर आउटपुट करने वाली सभी असफल इकाई मिलती है , प्रत्येक असफल इकाई के लिए परीक्षण के कई पुन: रनों को सहेजते हुए, जैसा कि रॉबर्ट ने दिया है, अभी भी और अधिक सुरुचिपूर्ण तरीके हैं। – dove

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