2009-08-04 22 views
75

मैं एक छोटे से टेस्ट सबसे पहले विकास करने के लिए कोशिश कर रहा हूँ, और मैं सत्यापित करने के लिए है कि मेरे कक्षाएं एक विशेषता के साथ चिह्नित हैं कोशिश कर रहा हूँ: कक्षा में उस विशेषता सौंपा हैपरीक्षण करें यदि किसी वर्ग में कोई विशेषता है?

[SubControllerActionToViewDataAttribute] 
public class ScheduleController : Controller 

मैं कैसे इकाई परीक्षण करना इसके लिए?

उत्तर

97

जाँच लें कि

Attribute.GetCustomAttribute(typeof(ScheduleController), 
    typeof(SubControllerActionToViewDataAttribute)) 

अशक्त (Assert.IsNotNull या समान)

(कारण मैं नहीं बल्कि IsDefined की तुलना में इस का उपयोग नहीं है अधिकांश समय मैं भी विशेषता के कुछ गुणों को मान्य करने के लिए चाहते हैं। ...)

+5

केवल यह जांचने के लिए कि विशेषता मौजूद है या नहीं, जो आम तौर पर पैरामीटर रहित/संपत्तिहीन विशेषताओं के लिए आवश्यक है, यह उपयोग करने के लिए सस्ता है। यह परिभाषित है, क्योंकि यह मेटाडेटा से पूछताछ करेगा, और विशेषता वस्तु को deserialize और तत्काल नहीं है। –

+0

IsDefined सस्ता होने के बारे में बिंदु है ... लेकिन ज्यादातर मामलों में (और विशेष इकाई परीक्षणों में) आप अंतर को ध्यान में रखते हुए संभावना नहीं है। शायद अगर यह उत्पादन कोड में एक तंग लूप था ... –

+0

@ मार्क- मैं इस बात से सहमत हूं कि प्रदर्शन में अंतर शायद यूनिट परीक्षण में ध्यान देने योग्य नहीं होगा। अगर मुझे इसका इस्तेमाल करने की ज़रूरत है तो मुझे विशेषता मिल जाएगी, जैसा कि आप कहते हैं कि ज्यादातर मामलों में परिदृश्य है। मैंने हाल ही में एक ढांचे में IsDefined का उपयोग किया था जिसे मैं सॉर्ट करने योग्य फ़ील्ड के ड्रॉपडाउन में कॉलम को बाहर करने के लिए लिख रहा था- यह अच्छी तरह से काम करता था क्योंकि मुझे विशेषता के लिए उपयोग करने की आवश्यकता नहीं थी। – RichardOD

54

वैसे ही आप सामान्य रूप से कक्षा में एक विशेषता की जांच करेंगे।

यहां कुछ नमूना कोड है।

typeof(ScheduleController) 
.IsDefined(typeof(SubControllerActionToViewDataAttribute), false); 

मुझे लगता है कि कई मामलों में यूनिट परीक्षण में एक विशेषता के अस्तित्व के लिए परीक्षण गलत है। चूंकि मैंने एमवीसी contrib की उप नियंत्रक कार्यक्षमता का उपयोग नहीं किया है, मैं टिप्पणी नहीं कर सकता कि यह इस मामले में उचित है या नहीं।

+0

+1 किया और फिर त्रुटि देखी। यह होना चाहिए Is परिभाषित (टाइपोफ (प्रकार), झूठा); –

+0

@alexanderb आप बिल्कुल सही हैं। मैंने अभी अपना जवाब अपडेट कर लिया है। मुझे उस वक्त संकलक के खिलाफ मेरा जवाब नहीं देखना चाहिए! – RichardOD

+7

त्रुटि को इंगित करने के लिए धन्यवाद यह दृष्टिकोण तेज़ है – Slava

5

मुझे पता है कि यह धागा वास्तव में पुराना है, लेकिन अगर कोई उस पर ठोकर खाता है तो आपको fluentassertions प्रोजेक्ट इस तरह के दावे करने के लिए बहुत सुविधाजनक लगता है।

typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>(); 
8

यह भी इस पर जेनरिक उपयोग करना संभव है:

var type = typeof(SomeType); 
var attribute = type.GetCustomAttribute<SomeAttribute>(); 

इस तरह से आप एक और typeof(...), जो कोड क्लीनर कर सकते हैं की जरूरत नहीं है।

+0

यह मेरे लिए काम नहीं करता है। कौन सा 'उपयोग' .. क्या मुझे याद आ रही है? –

+0

@ स्कैनजी मुझे यकीन नहीं है, क्या आप आईडीई का उपयोग नहीं कर रहे हैं? (आमतौर पर वे सही 'उपयोग' का सुझाव देते हैं) आपको क्या त्रुटि मिलती है? – Kroltan

+1

ठीक है, [यहां] (https://msdn.microsoft.com/it-it/library/hh194292 (v = vs.110) .aspx) मैंने पाया है कि 'GetCustomAttribute ' विधि .NET 4.5 से उपलब्ध है और मेरा आईडीई 3.5 पर सेट किया गया था इसलिए अब सब कुछ स्पष्ट है –

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