NUnit Assert.Throws विधि या ExpectedException विशेषता का उपयोग करें?


146

मैंने पाया है कि ये अपवादों के परीक्षण के दो मुख्य तरीके प्रतीत होते हैं:

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

[ExpectedException(typeof(Exception))]

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


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

1
NUnit संस्करण 3 और बाद में अब ExpectedExceptionविशेषता का समर्थन नहीं करता है , इसलिए संस्करण 3+ के लिए केवल Assert.Throwsसंस्करण प्रासंगिक है।
जोनलोफे

ऐसा क्यों है? उस Nunit3 ने उस समर्थन को छोड़ने का फैसला किया? चारों ओर गुगली कर रहा था और इसके लिए स्पष्टीकरण नहीं मिला ... JUnit अभी भी इस तरह से समर्थन करता है, है ना?
अहमन

जवाबों:


92

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

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

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


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

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

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

254

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

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

NUnit 3.0 ExpectedExceptionपूरी तरह से आधिकारिक समर्थन को गिरा देता है।

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


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

1
अंत में उत्तर दें कि मुझे काम करने की उम्मीद क्यों नहीं है। संस्करण 3 के साथ ..
21

2
यहाँ लिंक github.com/nunit/docs/wiki/Breaking-Changes - ExpectedExceptionAttribute अब समर्थित नहीं है।
एंटोन लियहिन

NUnit 3.0 के तहत काम करने के लिए
Andrei Krasutski

38

मैं 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");

    }

यह बेहतर उत्तरों में से एक है, यह बहुत आम है कि आप यह सत्यापित करना चाहते हैं कि अपवाद फेंके जाने के बाद कुछ गड़बड़ हो गया है।
Rhys Bevilaqua

11

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

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

1

यदि आप पुराने संस्करण ( <= 2.0 ) का उपयोग कर रहे हैं NUnitतो आपको उपयोग करने की आवश्यकता है ExpectedException

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

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

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

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