2013-02-25 9 views
10

के लिए ऑटोफिक्चर परीक्षण मेरे पास निम्न श्रेणी और परीक्षण है। मैं कन्स्ट्रक्टर के पैरामीटर के रूप में एक शून्य मान पास करने का परीक्षण करना चाहता हूं और ArgumentNullException की अपेक्षा कर रहा हूं। लेकिन चूंकि मैं ऑटोफिक्चर की CreateAnonymous विधि का उपयोग करता हूं, इसलिए मुझे इसके बजाय TargetInvocationException मिलता है।अमान्य कन्स्ट्रक्टर पैरामीटर

उन प्रकार के परीक्षणों को लिखने का सही तरीका क्या है?

public sealed class CreateObject : Command { 
    // Properties 
    public ObjectId[] Ids { get; private set; } 
    public ObjectTypeId ObjectType { get; private set; } 
    public UserId CreatedBy { get; private set; } 

    // Constructor 
    public CreateObject(ObjectId[] ids, ObjectTypeId objectType, UserId createdBy) { 
     Guard.NotNull(ids, "ids"); 
     Guard.NotNull(objectType, "objectType"); 
     Guard.NotNull(createdBy, "createdBy"); 

     Ids = ids; 
     ObjectType = objectType; 
     CreatedBy = createdBy; 
    } 
} 

[TestMethod] 
[ExpectedException(typeof(ArgumentNullException))] 
public void constructor_with_null_ids_throw() { 
    fixture.Register<ObjectId[]>(() => null); 
    fixture.CreateAnonymous<CreateObject>(); 
} 
+3

मैं इस तरह के गार्ड क्लॉज सत्यापन उच्च स्तर पर करता हूं - http://stackoverflow.com/a/11455580/11635 देखें। साथ ही, ['ExpectedExceptionAttribute' एक बुरा विचार है - यदि आप xUnit का उपयोग नहीं कर सकते हैं तो कम से कम 'Assert.Throws'] का उपयोग करें (http://stackoverflow.com/a/113616/11635) (हाँ मुझे न तो पता है इनमें से 'TargetInvocationException' के संबंध में आपके प्रश्न का सामना करना पड़ता है, यही कारण है कि यह कोई जवाब नहीं है, लेकिन कोड को स्पष्ट करने के लिए कदम उठाना है ताकि आप इसके साथ काम कर सकें - भले ही यह एक बग है, आप एक स्पष्ट repro और अंतरिम –

उत्तर

11

आईएमओ, Ruben Bartelink's comment सबसे अच्छा जवाब है। यदि कोई निर्माता में किसी भी निर्माता तर्क एक गार्ड खण्ड कमी है

var fixture = new Fixture(); 
var assertion = new GuardClauseAssertion(fixture); 
assertion.Verify(typeof(CreateObject).GetConstructors()); 

सत्यापित करें विधि एक काफी विस्तृत अपवाद संदेश के साथ प्रदान करेगा:

AutoFixture.Idioms के साथ, आप इस के बजाय कर सकते हैं।


Fwiw, AutoFixture बड़े पैमाने पर प्रतिबिंब का उपयोग करता है, तो मैं इसे एक बग यह एक TargetInvocationException फेंकता है कि विचार नहीं करते। जबकि यह सभी TargetInvocationException उदाहरणों को अनदेखा कर सकता है और उनके InnerException गुणों को फिर से चला सकता है, जिसका अर्थ यह भी होगा (संभावित रूप से) मूल्यवान जानकारी (जैसे ऑटोफिक्चर स्टैक ट्रेस) का निपटान करना। मैंने यह माना है, लेकिन उस कारण से, उस दिशा में ऑटोफिक्चर नहीं लेना चाहते हैं। एक ग्राहक हमेशा जानकारी फ़िल्टर कर सकता है, लेकिन अगर जानकारी समय-समय पर हटा दी जाती है, तो कोई ग्राहक इसे वापस नहीं ले सकता है।

public Exception Unwrap(this Exception e) 
{ 
    var tie = e as TargetInvocationException; 
    if (tie != null) 
     return tie.InnerException; 
    return e; 
} 
+0

के लिए एक कामकाज परमनाम मूल्य की जांच करने के बारे में क्या? अगर मैं पैरामनाम या गलत मान निर्दिष्ट किए बिना नया ArgumentNullException फेंक देता हूं, तो आपका परीक्षण जारी रहेगा। –

+0

यदि आप ऐसा करते हैं, तो एक स्थिर कोड विश्लेषण उपकरण इसे उठा सकता है और आपको चेतावनी दी। आईआईआरसी, विजुअल स्टूडियो कोड विश्लेषण यह करता है। –

+0

लेकिन टीडीडी परिप्रेक्ष्य से यह सही समाधान नहीं है :) बेशक, मैं स्थिर विश्लेषण उपकरण (आर # गलत मूल्यों के बारे में चेतावनी) का उपयोग करता हूं, लेकिन मैं पैरानाम नाम देखना चाहता हूं यूनिट परीक्षण क्या ऑटोफिक्चर में यह संभव है? –

0

मैं इस समय मैं कुछ इसी तरह के लिए खोज रहा था भर में आया था: शायद कुछ इस तरह -

आप अन्य दृष्टिकोण पसंद करते हैं, यह नहीं बहुत कठिन एक सहायक विधि है कि अपवाद unwraps लिखने के लिए है। मैं इसे जोड़ना चाहता हूं, automoqcustomization और xunit के साथ संयुक्त, कोड नीचे भी काम करता है और इसका अधिक क्लीनर।

[Theory, AutoMoqData] 
    public void Constructor_GuardClausesArePresent(GuardClauseAssertion assertion) 
    { 
     assertion.Verify(typeof(foo).GetConstructors()); 
    } 

आपको निम्नानुसार ऑटोमोक्टाटा विशेषता बनाने की आवश्यकता है।

public class AutoMoqDataAttribute : AutoDataAttribute 
    { 
     public AutoMoqDataAttribute() : base(() => new Fixture().Customize(new AutoMoqCustomization())) 
     { 

     } 
    } 
संबंधित मुद्दे