यदि किसी वर्ग में विशेषता है तो परीक्षण करें?


101

मैं थोड़ा टेस्ट-फर्स्ट डेवलप करने की कोशिश कर रहा हूं, और मैं यह सत्यापित करने की कोशिश कर रहा हूं कि मेरी कक्षाएं एक विशेषता के साथ चिह्नित हैं:

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

मैं इकाई का परीक्षण कैसे करूं कि उस विशेषता को किस वर्ग ने सौंपा है?

जवाबों:


123

जांच करे

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

अशक्त ( Assert.IsNotNullया समान) नहीं है

(इसके बजाय मैं इसका उपयोग करता हूं IsDefined, क्योंकि ज्यादातर बार मैं विशेषता के कुछ गुणों को भी मान्य करना चाहता हूं ....)


6
केवल यह देखने के लिए कि क्या विशेषता मौजूद है, जो कि आमतौर पर पैरामीटर रहित / गुणहीन विशेषताओं के लिए आवश्यक है, यह उपयोग करने के लिए सस्ता है। इसे परिभाषित किया जाता है, क्योंकि यह मेटाडेटा को क्वेरी करेगा, और विशेषता ऑब्जेक्ट को डिसेरिएलाइज़ और तत्काल नहीं करेगा।
लास वी। कार्लसन

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

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

हम एक विधि के लिए एक ही परीक्षण कैसे कर सकते हैं?
मनविंदर सिंह

80

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

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

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

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


+1 किया और फिर त्रुटि देखी। यह होना चाहिए। सुरक्षित (टाइपोफ़ (टाइप), गलत);
अलेक्जेंडर बेलेटस्की

@alexanderb आप निश्चित रूप से सही हैं। मैंने अब अपना उत्तर अपडेट कर दिया है। मुझे उस समय कंपाइलर के खिलाफ अपने जवाब की जाँच नहीं करनी चाहिए! त्रुटि को इंगित करने के लिए धन्यवाद
रिचर्डॉड

10
यह तरीका और तेज है, फिर पिछला
स्लाव

18

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

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

इस तरह से आपको दूसरे की आवश्यकता नहीं है typeof(...), जो कोड क्लीनर बना सकता है।


यह मेरे लिए काम नहीं करता है। कौन सा using.. मैं याद कर रहा हूँ?

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

1
ठीक है, यहाँ मैंने पाया है कि GetCustomAttribute<SomeAttribute>विधि .NET 4.5 से उपलब्ध है और मेरी IDE 3.5 पर सेट है, इसलिए अब सब कुछ स्पष्ट है

9

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

typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.