2010-12-13 7 views
12

में अपवादों को अनदेखा करना मेरे पास कुछ ऐसे मामले हैं जहां मुझे परवाह नहीं है कि अपवाद फेंक दिया गया है (जब तक कुछ अपवाद फेंक दिया जाता है)। दुर्भाग्य से,xUnit.net

Assert.Throws<Exception>(someDelegate); 

पास नहीं है जब तक कि वास्तव में Exception का एक उदाहरण (ऐसा नहीं एक व्युत्पन्न वर्ग का एक उदाहरण) फेंक दिया है। मुझे पता है कि मैं

Exception exception = Record.Exception(someDelegate); 
Assert.NotNull(exception); 

के साथ इच्छित व्यवहार प्राप्त कर सकता हूं लेकिन यह सही नहीं पढ़ता है। क्या मुझे xUnit में कुछ याद आ रहा है जिसमें मेरा व्यवहार है?

[Fact] 
public void Throws_exception_and_passes() { 
    Exception exception = Record.Exception(
     () => { throw new InvalidOperationException(); } 
    ); 
    Assert.NotNull(exception); 
} 

[Fact] 
public void Throws_exception_and_fails() { 
    Assert.Throws<Exception>(
     () => { throw new InvalidOperationException(); } 
    ); 
} 

उत्तर

6

प्रलेखन यहां प्रति:

http://xunit.codeplex.com/wikipage?title=HowToUse&referringTitle=Home

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

इसके आसपास के तरीके हैं, जैसे स्वयं को पकड़ने की कोशिश करना, लेकिन आपको अपना डिज़ाइन थोड़ा बदलना चाहिए।

+0

पूरी तरह से पाठ के साथ सहमत हैं। बस उस [@ जोन हन्ना 'उत्तर] को जोड़ना चाहता था (http://stackoverflow.com/a/32468935/11635) अब अंतर्निहित' थ्रोसएनी 'का विवरण देता है जो ओपी के वांछित व्यवहार को लागू करता है –

+0

लिंक टूटा हुआ है। xUnit github – mortb

2

XUnit अपने रास्ते में खड़ा नहीं होगा, तो आप क्या करना चाहते अपनी खुद की Custom Assertion, कुछ की तरह:

public static bool Throws<T>(this Action action, bool discardExceptions = false) 
    where T : Exception 
{ 
    try 
    { 
     action.Invoke(); 
    } 
    catch (T) 
    { 
     return true; 
    } 
    catch (Exception) 
    { 
     if (discardExceptions) 
     { 
      return false; 
     } 
     throw; 
    } 
    return false; 
} 

या:

public static bool Throws(this Action action) 
{ 
    try 
    { 
     action.Invoke(); 
    } 
    catch (Exception) 
    { 
     return true; 
    } 
    return false; 
} 
+0

पर स्थानांतरित हो गया है नोट: आपको यह सुनिश्चित करना होगा कि xUnits आंतरिक Assert-Exceptions को आंतरिक अपवाद – k3b

+0

धन्यवाद k3b को पुनर्स्थापित करने के लिए अतिरिक्त पकड़ जोड़कर फ़िल्टर नहीं किया गया है। साथ ही, इस सावधानी से इसका उपयोग करें क्योंकि यदि आपके द्वारा किए जाने वाले क्रिया के कहीं और दुष्प्रभाव होते हैं तो चीजें गन्दा हो जाएंगी। मुझे नहीं पता कि xUnit एक समान विधि का उपयोग करता है, लेकिन मुझे लगता है कि आप आसानी से पर्याप्त जांच सकते हैं। – Nobody

2

पहचान लेने के बाद अगर Assert.Throws<T> नहीं करता है बिल फिट करें, xUnit में एकमात्र ओओटीबी चीज जिसे आप छोड़ दिया है Record.Exception का उपयोग कर रहा है।

आप की पहचान की है के रूप में, एक 'जोर करने का मुख्य रास्ता फेंकता anything` इसे

Assert.NotNull(Record.Exception(lambda)) 

देखो क्या करना है - बहुत नहीं। यह डिजाइन द्वारा संभावना है; xUnit.net में बहुत कम चीजें हैं जो दुर्घटनाग्रस्त हैं (सावधानी से विचार किए गए विचारों के विपरीत)।

Record.Exception किसी कारण के लिए परिणाम देता है (और यदि आप एफ # का उपयोग कर रहे थे, तो आपको मूल्य को दूर करने के लिए |> ignore करना होगा)। हो रहा है कि अपवाद की प्रकृति के बारे में आपको हमेशा Assert करने में सक्षम होना चाहिए ताकि आपके कोड में वास्तविक समस्या को समय के साथ अपना कोड बदलने के अवसर से अनदेखा न किया जाए, जो कि इन सभी परीक्षण सामग्री का कारण है पहली जगह। शायद यह है कि को देखते हुए

var exception = Record.Exception(sut.Something); 
Assert.True(typeof(SomeException).IsAssignableFrom(exception)); 

का रूप ले सकता है, यह है कि एक Assert.NotNull() सुरक्षित है, लेकिन अभी भी सही नहीं लगता है। यह समय है, जैसा कि GOOS, में चर्चा की गई है, अपने परीक्षणों को सुनें (और एक राय परीक्षण ढांचे के मामले में, आपका परीक्षण ढांचा)।


अपने प्रश्न में सबसे बड़ी समस्या है लेकिन एक असली परीक्षा से एक वास्तविक उदाहरण में, वहाँ हमेशा अपने इंटरफेस स्पष्ट करने या अन्य तरीके से आपके उम्मीद व्यक्त करने के लिए एक तरीका है कि है, इसलिए वास्तविक जवाब Mu है।

1

मैं सिर्फ xUnit.net source में देख रहा था और यहाँ दोषी है:

private static Exception Throws(Type exceptionType, Exception exception) 
{ 
    Guard.ArgumentNotNull("exceptionType", exceptionType); 

    if (exception == null) 
     throw new ThrowsException(exceptionType); 

    if (!exceptionType.Equals(exception.GetType())) 
     throw new ThrowsException(exceptionType, exception); 

    return exception; 
} 

क्या हल होगा अगर इस परिवर्तन लागू किया गया तुम्हारी समस्या क्या है:

if(!exceptionType.Equals(exception.GetType())) 

रहे हैं:

if(!exception.GetType().IsAssignableTo(exceptionType)) 

आप संभवतः पैच सबमिट करने की पेशकश कर सकते हैं?

+0

जैसा कि मेरे उत्तर में बताया गया है, यहां कोई 'अपराधी' नहीं है। शून्य मौका है कि यह इस तरह से संयोग से लिखा गया था - विचार यह है कि परीक्षणों के बारे में विशिष्ट होना चाहिए कि अंततः अपवाद इंटरफ़ेस का हिस्सा हैं। @ आरएमएक्स का जवाब बताता है कि कोई ऐसा कुछ कैसे लिख सकता है जो ओपी अपेक्षा करता है और http://stackoverflow.com/a/32468935/11635 अब अंतर्निहित- 'ThrowsAny' –

4

यह इस सवाल के समय मौजूद नहीं था, लेकिन अब एक Assert.ThrowsAny<Exception> उपयोग कर सकते हैं से Exception (और इसलिए किसी भी अपवाद सब पर) व्युत्पन्न किसी भी अपवाद के लिए परीक्षण करने के लिए, इस तरह के Assert.ThrowsAny<ArgumentException> जो किसी भी के लिए परीक्षण के रूप में वेरिएंट के साथ अपवाद ArgumentException से लिया गया और इसी तरह से।

+0

का वर्णन करता है, यह प्रश्न * लेकिन * उत्तर का उत्तर देता है [poindexter] से (http://stackoverflow.com/a/4451224/2874896) वास्तव में अपने परीक्षण लिखने से पहले विचार करने लायक है। –

0
public static void SuppressException<TSut>(this TSut value, Action<TSut> action) where TSut : class 
    { 
     try 
     { 
      action.Invoke(value); 
     } 
     catch (Exception) 
     { 
      //do nothing 
     } 
    }