2013-04-17 6 views
13

मैं अपने परीक्षण के लिए MOQ ढांचे के साथ काम कर रहा था। मेरे पास एक परिदृश्य है जिसमें मुझे एक गलती अपवाद फेंकने की उम्मीद है। मैं इसे कैसे सत्यापित कर सकता हूं इसे सत्यापित किया जा सकता है?MOQ - सत्यापित अपवाद

public void Koko(List<string?> list) 
{ 
    foreach(string? str in list) 
    { 
     if (str != null) someProperty.Foo(str); 
     else throw new FormatException(); 
    } 
} 

अग्रिम धन्यवाद।

+0

अपना काम दिखाएं .. लोग आपके दिमाग को नहीं पढ़ सकते हैं। कृपया [एफएक्यू] और [पूछें] भी पढ़ें .. –

उत्तर

6

कृपया यह Introduction to Moq पढ़ें।

mock.Setup(foo => foo.DoSomething()).Throws<InvalidOperationException>(); 

तो बस यह सत्यापित करें कि विधि बुलाया गया था: यहाँ सेटअप InvalidOperationException फेंक करने के लिए जिस तरह से जब DoSomething विधि शुरू हो जाती है है। यदि यह कहा जाता था, तो अपवाद

mock.Verify(foo => foo.DoSomething()); 
+0

मैं अपवाद स्थापित नहीं करना चाहता हूं। मैं यह सत्यापित करना चाहता हूं कि इसे फेंक दिया जाए। –

+0

@GZ आप यह सत्यापित करने की कोशिश कर रहे हैं कि मोक काम कर रहा है या नहीं? यदि आप अपवाद फेंकने की व्यवस्था करते हैं तो विधि को बुलाए जाने पर इसे फेंक दिया जाएगा। बस विधि को लागू किया गया था या नहीं। –

+0

मैं परिदृश्य को और विस्तार से समझाऊंगा। शायद मेरा दृष्टिकोण गलत है। मेरे पास दो ऑब्जेक्ट पर फ़ोरैच लूप चल रहा है। एक उपलब्ध है और एक शून्य है। मैं दो चीजों को सत्यापित करना चाहता हूं, उपलब्ध ऑब्जेक्ट पर पहली विधि चलाना और नल ऑब्जेक्ट के लिए एक अपवाद फेंक दिया गया है (विधि में मैं शून्य के लिए जांच करता हूं और यदि मैन्युअल रूप से अपवाद फेंकता है)। –

6

परीक्षण कर सकते हैं कि एक अपवाद NUnit का दावा है का उपयोग कर फेंक दिया जाता है उठाया गया था:

Assert.That(() => testObject.methodToTest(), Throws.TypeOf<FaultException>()); 
18

आप एक अपवाद जांच करना चाहते हैं फेंक दिया गया था (अपने खुद के कोड से) तो मोक उस के लिए आपकी पसंद का साधन नहीं है। बस यूनिट परीक्षण ढांचे में से एक का उपयोग करें।

XUnit/NUnit

Fluent दावे

Action act =() => foo.Bar()); 
act.ShouldThrow<SomeException>() 

http://fluentassertions.codeplex.com/documentation

http://www.nunit.org/index.php?p=exceptionAsserts&r=2.6.2

0

ठीक है तो मैं यह निम्नलिखित तरीके से हल किया।

चूंकि अपवाद ने मेरा परीक्षण तोड़ दिया क्योंकि मैंने कोशिश कॉल में कारण ब्लॉक में विधि कॉल डाला।

तब मैं एक सरल सत्यापन का उपयोग कर सकता था।

सभी सहायकों को धन्यवाद ...

+4

अपनी पोस्टिंग पर विचार करें समाधान कोड, क्योंकि अन्य इससे सीख सकते हैं या उस पर टिप्पणी कर सकते हैं। आप इस उत्तर को समाधान के रूप में भी चिह्नित कर सकते हैं। –

+2

लगता है जैसे एलनटी का सही जवाब था। मोक में यदि आप 'फू (स्ट्रिंग)' का परीक्षण करना चाहते हैं तो 'ArgumentException' फेंक देगा' आपको 'ExpectException' – steve

18

मैं गलत पढ़ने अपने इरादे हो सकता है, लेकिन जहां तक ​​मैं देख सकता हूँ क्रम में एक नकली करने के लिए कुछ भी करने को परीक्षण करने के लिए है कि अपवाद किया गया है कोई जरूरत नहीं है फेंक दिया।

ऐसा लगता है कि एक विधि फू कि एक स्ट्रिंग लेता है के साथ एक वर्ग है - सुविधा देता है इस InnerClass

public class InnerClass { 
    public virtual void Foo(string str) { 
     // do something with the string 
    } 
} 

और एक वर्ग है जो एक संपत्ति (someProperty) के रूप में एक InnerClass शामिल है जो एक सदस्य Koko है फोन है कि एक पैरामीटर के रूप में एक सूची < स्ट्रिंग > लेता

public class OuterClass { 

    private readonly InnerClass someProperty; 

    public OuterClass(InnerClass someProperty) { 
     this.someProperty = someProperty; 
    } 

    public void Koko(List<string> list) { 
     foreach (var str in list) { 
       if (str != null) 
        someProperty.Foo(str); 
       else 
        throw new FormatException(); 
      } 
    } 
} 

नोट: मैं सूची < स्ट्रिंग नहीं मिल सकता है? संकलित करने के लिए > - मुझे बताता है कि अंतर्निहित प्रकार (स्ट्रिंग) गैर-शून्य होना चाहिए। AFAIK, केवल एक को मूल्य प्रकारों को कम करने की आवश्यकता है, संदर्भ प्रकार पूरी तरह से शून्य हैं।

ऐसा लगता है कि आप यह जांचना चाहते हैं कि यदि आप तारों की एक सूची में गुजरते हैं, तो उनमें से कोई भी स्वरूप स्वरूप को फेंक दिया जाता है।

यदि ऐसा है, तो MOQ के लिए एकमात्र कारण हमें इनर क्लास कार्यक्षमता के बारे में चिंता करने से मुक्त करना है। फू एक विधि है, इसलिए, जब तक कि हम सख्त मोक्स का उपयोग नहीं कर रहे हैं, हम किसी अन्य सेटअप के साथ केवल इनर क्लास मॉक बना सकते हैं।

एक विशेषता [ExpectedException] है जिसके साथ हम यह सत्यापित करने के लिए हमारे परीक्षण को टैग कर सकते हैं कि अपवाद फेंक दिया गया है।

[TestMethod] 
[ExpectedException(typeof(FormatException))] 
public void ExceptionThrown() { 

    var list = new List<string>() { 
     "Abel", 
     "Baker", 
     null, 
     "Charlie" 
    }; 

    var outer = new OuterClass(new Mock<InnerClass>().Object); 
    outer.Koko(list); 

} 

यह परीक्षण तब होगा जब कोई प्रारूप अपवाद फेंक दिया गया हो और विफल हो जाए।

+0

का उपयोग करना चाहिए, मुझे अपेक्षित अपवाद विशेषता के बारे में पता नहीं था, यह बहुत अच्छा है! धन्यवाद। – chrjs

+0

यह वास्तविक जवाब है। धन्यवाद – CubanTurin

5

एक पुरानी सवाल है, लेकिन कोई स्रोत कोड वास्तव में दिखा क्या समाधान था, इसलिए यहाँ मैं क्या किया है:

var correctExceptionThrown = false; 

try 
{ 
    _myClass.DoSomething(x); 
} 
catch (Exception ex) 
{ 
    if (ex.Message == "Expected message") 
     correctExceptionThrown = true; 
}      

Assert.IsTrue(correctExceptionThrown); 

नोट के बजाय संदेश की जाँच, आप (आम तौर पर बेहतर) अपवाद की एक विशेष प्रकार पकड़ कर सकते हैं ।