2013-02-15 69 views
8

बस कुछ रोचक व्यवहार में आया - AssertCatch ब्लॉक द्वारा पकड़ा जा रहा है।कोशिश करें .. कैच ब्लॉक पकड़ा गया है

List<Decimal> consArray = new List<decimal>(); 
try 
{ 
    Decimal d; 
    Assert.IsTrue(Decimal.TryParse(item.Value, out d)); 
    consArray.Add(d); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(item.Value); 
    Console.WriteLine(e); 
} 

जोर AssertFailedException फेंकता है और उसके catch से पकड़ा। हमेशा सोचा कि अगर Assert विफल रहता है तो परीक्षण विफल हो जाता है और लगातार निष्पादन निरस्त कर दिया जाता है। लेकिन उस मामले में - परीक्षण के साथ चलता है। यदि कुछ भी गलत नहीं होता है - मुझे हरा परीक्षण मिलता है! सिद्धांत में - क्या यह सही व्यवहार है?

संपादित: मैं समझता हूं कि शायद यह .NET प्रतिबंध है और एमएसटेस्ट में कितने आवेषण किए जाते हैं। दावा अपवाद फेंकता है। चूंकि catch - सबकुछ पकड़ता है जो इसे अपवाद अपवाद पकड़ता है। लेकिन क्या यह सिद्धांत या एमएसटेस्ट में सही है?

उत्तर

4

NUnit वही काम करेगा। जैसा कि मुझे लगता है कि किसी भी अन्य परीक्षण ढांचे को चाहिए, लेकिन मुझे सी # में केवल MStest और NUnit पता है।

मुझे उम्मीद है कि आपके टेस्ट कोड में Decimal.TryParse नहीं होगा, लेकिन आपका व्यावसायिक तर्क ऐसा करेगा, जिसे आप किसी ऑब्जेक्ट और विधि कॉल के साथ परीक्षण करेंगे।

कुछ की तरह:

var sut = new Sut(); 
var d = sut.DoSomethingThatReturnsTheDecimal(item.Value); 

Assert.AreEqual(0.123, d, string.Format("passed value can not be parsed to decimal ({0})", item.Value); 

आदेश में थोड़ा अपने कार्यान्वयन के करीब रहने के लिए:

List<Decimal> consArray = new List<decimal>(); 

Decimal d = Decimal.MinValue; 

// You don't need to try-catch a Decimal.TryParse 
// Decimal.TryParse(item.Value, out d)); 

try 
{ 
    d = Decimal.Parse(item.Value) 
} 
catch 
{ 
    // Handle exception 
} 

Assert.AreEqual(0.123, d); 

// Does the list add anything at all? In this sample it seems a bit redundant 
consArray.Add(d); 

वैसे भी, आपके सवाल का जवाब देना। कोशिश-पकड़ को आपके AssertFailedException को पकड़ना है।

पीएस: AsserFailedException को पकड़ना और इसे फिर से फेंकना भी काम करेगा, लेकिन यह मेरे लिए थोड़ा अजीब लगता है। मैं किसी भी try-catch ब्लॉक के बाहर Assert एस छोड़ने का प्रयास करता हूं। लेकिन यह सिर्फ मेरी राय हो सकती है जिसे आपने नहीं पूछा :)।

+0

में अपने उदाहरण में चित्र करने की कोशिश की थी यह स्पाइक था - तर्क विधि में ले जाया जाएगा। वैसे भी, मुझे ध्यान दें - MsTest में try..catch का उपयोग न करें। अभी भी दिलचस्प है कि यह अन्य परीक्षण ढांचे में कैसे जा रहा है - जावा, पीएचपी। – nikita

+0

आह क्षमा करें सोचा था कि आप सी # ढांचे का मतलब है। जावा थोड़ी देर पहले है लेकिन यकीन है कि यह वही करता है। युक्ति: जावा, PHP, आदि की जानकारी के साथ प्रश्न अपडेट करें जो आपको रूचि देता है। अपने उत्तर और खुश कोडिंग के साथ ग्ले :) – bas

5

आपका कोड अपेक्षित के रूप में काम कर रहा है। जब Assert विफल रहता है तो यह AssertFailedException फेंकता है जो Exception से विरासत प्राप्त करता है। तो आप try-catch जोड़ सकते हैं और इसे पकड़ सकते हैं।

अपने मामले में, के अंत में throw जोड़ें और अपवाद को फिर से फेंक दें।

+0

हाँ मुझे पता है कि यह काम करता है क्योंकि एस्र्ट अपवाद फेंकता है और पकड़ इसे पकड़ता है। बस जानना चाहते हैं कि यह टीडीडी सिद्धांत में सही है? परीक्षण की तुलना में असफल असफल होना चाहिए लाल - क्या यह नहीं है? क्या यह एमएसटीएस्ट विशिष्ट व्यवहार है? अन्य परीक्षण ढांचे के बारे में क्या? – nikita

+1

@nikita: इसका टीडीडी और न ही एमएसटेस्ट से कोई लेना देना नहीं है। 'Assert' किसी भी प्रकार का विशेष सदस्य नहीं है - यह सिर्फ एक ** वर्ग ** किसी अन्य की तरह है। सभी ढांचे बिल्कुल उसी तरह काम करते हैं। एक sidenote पर, आप वास्तव में 'try-catch' और न ही 'Console.WriteLine' का उपयोग अपने ** इकाई ** परीक्षण में नहीं करना चाहिए। –

+0

@jimmy_keen क्यों नहीं 'कंसोल। राइटलाइन'? वास्तव में दिलचस्पी है .. – nikita

6

जैसा कि पहले से ही उत्तर दिया गया है, यह सही व्यवहार है। आप प्राप्त करने के लिए अपना कोड बदल सकते हैं AssertFailedException को पकड़कर और इसे फिर से फेंककर अपेक्षित व्यवहार।

 List<Decimal> consArray = new List<decimal>(); 
     try 
     { 
      Decimal d; 
      Assert.IsTrue(Decimal.TryParse(item.Value, out d)); 
      consArray.Add(d); 
     } 
     catch (AssertFailedException) 
     { 
      throw; 
     } 

     catch (Exception e) 
     { 
      Console.WriteLine(item.Value); 
      Console.WriteLine(e); 
     }