MSTest में अपवादों को पकड़ना: Assert.ThrowsException पर पूरी गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

MSTest में अपवाद कैसे पकड़ें और पागल न हों?

\n\n

आप C# में यूनिट टेस्ट लिख रहे हैं और अचानक महसूस करते हैं: आपकी विधि को एक निश्चित स्थिति में अपवाद फेंकना चाहिए। इसकी जाँच कैसे करें? यदि आपने गूगल पर "How do I use Assert to verify that an exception has been thrown with MSTest" सर्च किया है, तो आप अकेले नहीं हैं — यह Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है। और आज हम इसे हमेशा के लिए समझ लेंगे।

\n\n

इस लेख में मैं आपको MSTest में अपवादों की जाँच के सभी तरीके दिखाऊंगा: क्लासिक एट्रीब्यूट से लेकर आधुनिक Assert.ThrowsException तक। आप सीखेंगे कि कैसे साफ, विश्वसनीय टेस्ट लिखें जो सबसे अनुपयुक्त समय पर फेल न हों। चलिए शुरू करते हैं!

\n\n

अपवादों की जाँच क्यों महत्वपूर्ण है?

\n\n

कल्पना करें: आपके पास एक विधि है Divide(int a, int b)। यदि b = 0 है, तो इसे DivideByZeroException फेंकना चाहिए। बिना टेस्ट के, आपको इसके बारे में तब पता चलेगा जब एप्लिकेशन प्रोडक्शन में क्रैश होगा। अपवाद जाँच के साथ यूनिट-टेस्ट आपकी सुरक्षा रस्सी है।

\n\n

MSTest (माइक्रोसॉफ्ट का मॉड्यूलर टेस्टिंग फ्रेमवर्क) में कई दृष्टिकोण हैं। हम प्रत्येक पर विचार करेंगे, लेकिन सबसे आधुनिक और अनुशंसित से शुरू करेंगे।

\n\n

विधि 1: Assert.ThrowsException (सबसे सही)

\n\n

MSTest V2 (संस्करण 2.x) से शुरू करते हुए, हमारे पास अंतर्निहित विधि Assert.ThrowsException<T> है। यह सुरुचिपूर्ण, पढ़ने योग्य और लचीला है। सिंटैक्स सरल है:

\n\n
[TestMethod]\npublic void Divide_ByZero_ThrowsDivideByZeroException()\n{\n    // Arrange\n    var calculator = new Calculator();\n\n    // Act & Assert\n    Assert.ThrowsException<DivideByZeroException>(() => calculator.Divide(10, 0));\n}
\n\n

यहाँ क्या हो रहा है? हम विधि कॉल के साथ एक लैम्ब्डा एक्सप्रेशन पास करते हैं। MSTest इसे try-catch ब्लॉक के अंदर निष्पादित करता है। यदि अपवाद नहीं फेंका जाता है — टेस्ट फेल हो जाता है। यदि किसी अन्य प्रकार का अपवाद फेंका जाता है — वह भी फेल हो जाता है। केवल आवश्यक अपवाद सफलता की ओर ले जाता है।

\n\n

उन्नत उदाहरण: अपवाद संदेश की जाँच

\n\n

कभी-कभी न केवल अपवाद के प्रकार बल्कि उसके संदेश की भी पुष्टि करना आवश्यक होता है। इसके लिए message पैरामीटर के साथ ओवरलोड का उपयोग करें या अपवाद ऑब्जेक्ट के गुणों की जाँच करें:

\n\n
[TestMethod]\npublic void GetUserById_InvalidId_ThrowsWithCorrectMessage()\n{\n    // Arrange\n    var service = new UserService();\n\n    // Act\n    var exception = Assert.ThrowsException<ArgumentException>(() => service.GetUserById(-1));\n\n    // Assert अतिरिक्त\n    Assert.AreEqual("Id must be positive", exception.Message);\n}
\n\n

ध्यान दें: Assert.ThrowsException अपवाद ऑब्जेक्ट लौटाता है! यह आपको इसके किसी भी गुण की जाँच करने की अनुमति देता है: InnerException, Data, StackTrace (हालांकि आमतौर पर अंतिम की जाँच नहीं की जाती है)।

\n\n

विधि 2: [ExpectedException] एट्रीब्यूट (पुराना, लेकिन अभी भी उपयोग में)

\n\n

पहले (MSTest V1 में) टेस्ट विधि के ऊपर एक एट्रीब्यूट का उपयोग किया जाता था। यह इस तरह दिखता था:

\n\n
[TestMethod]\n[ExpectedException(typeof(DivideByZeroException))]\npublic void Divide_ByZero_ThrowsDivideByZeroException_OldWay()\n{\n    var calculator = new Calculator();\n    calculator.Divide(10, 0);\n}
\n\n

सुविधाजनक लगता है? लेकिन तीन समस्याएं हैं:

\n
    \n
  • अपवाद संदेश की जाँच नहीं कर सकते। आप नहीं जानते कि सही अपवाद फेंका गया है या नहीं।
  • \n
  • इस प्रकार का कोई भी अपवाद — सफलता। भले ही वह कोड की किसी अन्य पंक्ति से आया हो (जैसे, Arrange में)।
  • \n
  • अपवाद के बाद कोड निष्पादित नहीं कर सकते। टेस्ट विधि तुरंत बाधित हो जाती है।
  • \n
\n\n

इसलिए नए प्रोजेक्ट्स में Assert.ThrowsException का उपयोग करें। [ExpectedException] एट्रीब्यूट को deprecated (पुराना) चिह्नित किया गया है और भविष्य के संस्करणों में हटाया जा सकता है।

\n\n

विधि 3: मैन्युअल try-catch (एक्सट्रीम के लिए)

\n\n

कभी-कभी (बहुत कम) आपको

ब्लॉग

पुस्तक अनुशंसाएँ