2012-06-05 25 views
16

आम तौर पर आप परीक्षण करते हैं, यदि एक अपवाद किसी निश्चित विधि में फेंक दिया जाता है, तो निम्नानुसार। मैं FluentAssertions का उपयोग करें:क्या कन्स्ट्रक्टर अपवाद फेंकने के लिए परीक्षण करने के लिए और अधिक उचित है?

[Fact] 
public void Exception_gets_thrown() 
{ 
    // Arrange 
    var foo = new Foo("validArgument"); 

    // Act/Assert 
    foo.Invoking(f => f.Bar(null))   // null is an invalid argument 
     .ShouldThrow<ArgumentNullException>(); 
} 

लेकिन यह कैसे परीक्षण करने के लिए, एक अपवाद निर्माता में फेंक दिया जाता है तो क्या होगा? मैंने इसे अभी ऐसा किया है, लेकिन फ़्लूएंटएस्सेशन के माध्यम से शायद एक और उचित तरीका हो सकता है?

[Fact] 
public void Constructor_throws_Exception() 
{ 
    // Arrange 
    Action a =() => new Foo(null);   // null is an invalid argument 

    // Act/Assert 
    a.ShouldThrow<ArgumentNullException>(); 
} 
+2

मैं पुस्तकालय पता नहीं है, लेकिन मुझे पसंद है क्या आप –

उत्तर

13

है कि वास्तव में कैसे आप अपवाद के लिए परीक्षण करने के लिए माना जाता है और कि क्या ShouldThrow<T>() और ShouldNotThrow<T>() पहली जगह में के लिए डिजाइन किए गए थे है। वास्तव में, Invoking() दृष्टिकोण अगले बड़े संस्करण (2.0.0) में अप्रचलित के रूप में चिह्नित किया जा सकता है।

static Action Constructor<T>(Func<T> func) 
{ 
    return() => func(); 
} 

जो मैं तो इस तरह का उपयोग करें::

+0

किया है लेकिन यह परीक्षण करने के लिए सही तरीके से, अगर है कन्स्ट्रक्टर में एक अपवाद फेंक दिया जाता है? इस कार्रवाई के माध्यम से? –

+1

Invoking() दृष्टिकोण obsoleting के बारे में शर्म आती है। मुझे ऊपर दिए गए दूसरे टेस्ट में प्रदर्शित एक्शन तंत्र की तुलना में पढ़ने के लिए कहीं अधिक आसान लगता है। Invoking अच्छी तरह से सब कुछ एक साथ रखता है तो इरादा स्पष्ट है। –

+0

@ebeen मैं आमतौर पर कन्स्ट्रक्टर से अपवादों का परीक्षण करते समय [ExpectedException (typeof (ArgumentNullException)) का उपयोग करता हूं। यह देखते हुए कि परीक्षण में केवल एक पंक्ति है, अपवाद केवल वहां से फेंक दिया जा सकता है। –

0

मैं नीचे जब परीक्षण उपयोग के लिए निर्माताओं की तरह एक सहायक विधि जोड़ा

Constructor(() => new Foo("bar", null)) 
.ShouldThrow<ArgumentNullException>() 
.And 
.ParamName 
.Should() 
.Be("baz"); 

मैं जानता हूँ कि यह व्यक्तिगत स्वाद की बात है, लेकिन मैं पहले प्रतिनिधि को घोषित करने और असाइन करने की आवश्यकता से थोड़ा सा क्लीनर ढूंढें।

इस मूल प्रश्न में कोड ऐसा दिखाई बनाना होगा:

[Fact] 
public void Constructor_throws_Exception() 
{  
    // Act/Assert 
    Constructor(() => new Foo(null)).ShouldThrow<ArgumentNullException>(); 
}