2013-02-21 14 views
121

मैं खोज की है लेकिन इसके कुछ अपवाद के लिए परीक्षण के दो मुख्य तरीके होने लगते हैं कि:NUnit Assert का उपयोग करें। तीर विधि या अपेक्षित अपवाद विशेषता?

Assert.Throws<Exception>(()=>MethodThatThrows()); 

[ExpectedException(typeof(Exception))] 

इनमें से कौन सा सबसे अच्छा हो सकता है? क्या कोई दूसरे पर फायदे पेश करता है? या यह सिर्फ व्यक्तिगत वरीयता का मामला है?

+1

एक 3 विकल्प धाराप्रवाह शैली है: 'Assert.That (() => MethodThatThrows(), Throws.Exception) ' – Schneider

उत्तर

71

पहले आप एक से अधिक अपवाद के लिए परीक्षण करने के लिए कई कॉल के साथ की अनुमति देता है:

Assert.Throws(()=>MethodThatThrows()); 
Assert.Throws(()=>Method2ThatThrows()); 

दूसरा केवल आप परीक्षण समारोह प्रति एक अपवाद के लिए परीक्षण करने के लिए अनुमति देता है।

+19

एक परीक्षण केवल तर्क के एक अलग बिट का परीक्षण करना चाहिए, इसलिए उसी यूनिट परीक्षण में दो त्रुटियों का परीक्षण नहीं करना बुरा अभ्यास माना जाएगा? – SamuelDavis

+5

@ सैमुएल डेविस - सामान्य रूप से आप एक ही परीक्षण में विभिन्न मामलों का परीक्षण नहीं करना चाहते हैं। हालांकि, एकाधिक 'Assert.Throws' के लिए कुछ उपयोग केस हो सकते हैं। –

+2

किसी भी तरह से, यहां आपको पैरामीटर के रूप में अपवाद मिलता है, जो आपको अपवाद में विवरण देने की अनुमति देता है। इसके अलावा, "अपेक्षित अपवाद" का उपयोग करके आप किसी अन्य विधि कॉल में उसी अपवाद प्रकार को फेंकने के लिए आपकी सुरक्षा नहीं करते हैं। यहां, आप सटीक विधि को लक्षित करते हैं, न कि संपूर्ण परीक्षण। भले ही आपके परीक्षण को बहुत कम कोड कॉल करना चाहिए, फिर भी आप कभी भी सुरक्षित नहीं होते हैं। खासकर जब कोड जटिल हो जाता है और/या अपवाद बहुत सामान्य हो जाता है। "ArgumentNullExceptions" जैसी सामग्री को बहुत फेंक दिया जा सकता है और उदाहरण के लिए ExpectedException का उपयोग करके आसानी से मिस किया जा सकता है। जोर दें। तीर इसे याद नहीं करेंगे। –

28

मैं assert.throws पसंद करते हैं क्योंकि यह मुझे अपवाद फेंकने के बाद अन्य शर्तों को सत्यापित करने और जोर देने की अनुमति देता है।

[Test] 
    [Category("Slow")] 
    public void IsValidLogFileName_nullFileName_ThrowsExcpetion() 
    { 
     // the exception we expect thrown from the IsValidFileName method 
     var ex = Assert.Throws<ArgumentNullException>(() => a.IsValidLogFileName("")); 

     // now we can test the exception itself 
     Assert.That(ex.Message == "Blah"); 

    } 
+0

यह बेहतर उत्तरों में से एक है, यह बहुत आम है कि आप यह सत्यापित करना चाहते हैं कि अपवाद फेंकने के बाद कुछ गलत स्थिति में प्रवेश कर चुका है। –

226

मुख्य अंतर यह है:

ExpectedException() विशेषता परीक्षा उत्तीर्ण की है, तो अपवाद में होता है परीक्षा पद्धति में किसी भी जगह बनाता है।
Assert.Throws() का उपयोग exact कोड की जगह निर्दिष्ट करने की अनुमति देता है जहां अपवाद की उम्मीद है।

NUnit 3.0 ExpectedException के लिए आधिकारिक समर्थन छोड़ देता है।

तो, मैं निश्चित रूप से ExpectedException() विशेषता के बजाय Assert.Throws() विधि का उपयोग करना पसंद करता हूं।

+4

यह अब तक सही उत्तर है। संयोग से, Assert.Throws() अपवाद भी देता है, जो अपवाद के गुणों के अतिरिक्त निरीक्षण की अनुमति दे सकता है, यदि वे आपके लिए महत्वपूर्ण हैं। – perfectionist

+0

अंत में जवाब देने के कारण है कि मैं ExpectedException संस्करण 3. – johnyTee

+1

यहाँ के साथ काम करने .. नहीं मिल सकता है लिंक https://github.com/nunit/docs/wiki/Breaking-Changes है - ExpectedExceptionAttribute अब समर्थित नहीं। – Spirit

9

आप जिस त्रुटि की अपेक्षा कर रहे हैं उसे मजबूत प्रकार भी कर सकते हैं (पुराने अटारी संस्करण की तरह)।

Assert.Throws<System.InvalidOperationException>(() => breakingAction()) 
0

आप NUnit के पुराने संस्करण (< = 2,0) का उपयोग कर रहे हैं तो आप ExpectedException उपयोग करने के लिए की जरूरत है।

आप 2.5 या बाद के संस्करण का उपयोग कर रहे हैं तो आप उपयोग कर सकते हैं Assert.Throw()

https://github.com/nunit/docs/wiki/Breaking-Changes

उपयोग कैसे करें: https://www.nunit.org/index.php?p=exceptionAsserts&r=2.5

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