2010-11-01 14 views
9

डब्ल्यूसीएफ सेवाओं से अपेक्षित दोषों की इकाई परीक्षण करने का सबसे अच्छा तरीका क्या है?यूनिट परीक्षण डब्ल्यूसीएफ दोष

मैं एक डब्ल्यूसीएफ सेवा का परीक्षण करने का प्रयास कर रहा हूं जो एक निश्चित पुनरुत्पादन त्रुटि के लिए FaultExceptions को फेंक रहा है (सही ढंग से)। यूनिट परीक्षणों को डब्ल्यूसीएफ क्लाइंट का एक उदाहरण मिलता है और लागू सेवा विधि को कॉल करता है, जो एक FaultException फेंकता है।

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

मुझे लगता है कि विशिष्ट उपयोगकर्ता-अनचाहे अपवादों के लिए तोड़ने को अक्षम करने के लिए एक कॉन्फ़िगरेशन विकल्प है, लेकिन मुझे आशा थी कि कोई भी एक ही परिणाम प्राप्त करने के लिए एक बेहतर तरीका बता सकता है, क्योंकि यह किसी टीम में आसानी से करने योग्य नहीं है वातावरण।

यहाँ कार्यान्वयन वर्तमान की तरह दिखता है की कुछ नमूना कोड ...

इकाई परीक्षण परियोजना मेरी WCF सेवा के लिए एक सेवा संदर्भ में है, और मैं इस तरह के रूप इंटरफेस को परिभाषित किया है:

[OperationContract(Name = "DoSomething")] 
[FaultContract(typeof(EpicFail))] 
ResponseObject DoSomething(RequestObject requestObject); 

गलती इस तरह के रूप में परिभाषित किया जाता है:

[DataContract] 
public class EpicFail 
{ 

    public EpicFail(string action) 
    { 
     this.Reason = "Epic Fail"; 
     this.Action = action; 
    } 

    [DataMember] 
    public string Reason 
    { 
     get; 
     set; 
    } 

    [DataMember] 
    public string Action 
    { 
     get; 
     set; 
    } 

} 

कोड है कि सेवा कॉल इस तरह अस्पष्ट लग रहा है:

[TestMethod()] 
[ExpectedException(typeof(FaultException<EpicFail>))] 
public void FaultTest_Fails_Epicly() 
{ 
    bool testPassed = false; 

    try 
    { 
     ResponseObject resp = GetServiceClient().DoSomething(req); 
    } 
    catch (FaultException<EpicFail>) 
    { 
     testPassed = true; 
    } 

    Assert.IsTrue(testPassed); 
} 
  • मैं दिखाने के लिए कि मैं ExpectedException विशेषता का उपयोग कर रहा हूँ और यह जब अपवाद सेवा में फेंक दिया जाता है को तोड़ने से आईडीई/डिबगर रखने पर ज्यादा प्रभाव पड़ रहा हो प्रतीत नहीं होता है कोड का संपादन किया।
+0

आप इकाई परीक्षण के समान प्रक्रिया में WCF सेवा होस्ट कर रहे हैं, या एक अलग प्रक्रिया में? –

+0

अलग प्रक्रियाओं, डब्ल्यूसीएफ सेवा आईआईएस के माध्यम से आयोजित की जाती है। मैं डीबग मोड में स्थानीय रूप से यूनिट टेस्ट चला रहा हूं। दोनों परियोजनाएं एक ही समाधान का हिस्सा हैं। मुझे लगता है कि अगर मैं बिल्ड मोड में सेवा चलाता हूं और डीबग मोड में यूनिट परीक्षण करता हूं तो यह शायद समस्या को ठीक करेगा, लेकिन यह एक बेहतर समाधान की तरह प्रतीत नहीं होता है, तो आईडीई कॉन्फ़िगरेशन विकल्प .. यह अभी भी कुछ है जो मुझे हर किसी के लिए करना है मशीन। – mattv

+0

क्या आपके पास सभी अपवादों को तोड़ने के लिए आईडीई कॉन्फ़िगर किया गया है? – Kristen

उत्तर

1

आप यह सुनिश्चित करने के लिए हमेशा ExpectedExceptionAttribute (NUnit में) का उपयोग कर सकते हैं कि यह अपवाद फेंक दिया गया है। एमएसटीएस्ट में भी इसी तरह की अवधारणा है।

[ExpectedException(typeof(MyException))] 
void my_test() 
{ 
    // test 
} 

आपको बस इतना करना कुछ नकली सत्यापन है, तो मैं कोशिश/कैच ब्लॉक और पकड़ में सत्यापित करने का प्रयोग करेंगे और उसके बाद अपवाद फेंक देते हैं।

अद्यतन

आप ExpectedException विशेषता का उपयोग कर रहे हैं, आप अपवाद को पकड़ने के लिए बजाय आप NUnit कि उसे पकड़ने के लिए अपने परीक्षण चलाता है यह बताने के लिए की जरूरत नहीं जा सकते,।

आप अपवाद में विशेष जानकारी की पुष्टि करने तो आप अपवाद को पकड़ने, जानकारी की पुष्टि और उसके बाद की जरूरत है rethrow:

[ExpectedException(typeof(MyException))] 
void my_test() 
{ 
    try 
    { 
     // call the service 
    } 
    catch(MyException ex) 
    { 
      Assert.IsTrue(ex.Message.Contains("error code 200")); 
      throw ex; 
    } 

} 
+0

मैं वास्तव में यूनिट परीक्षण में अपेक्षित अपवाद विशेषता का उपयोग कर रहा हूं। शायद मैं इसे गलत तरीके से उपयोग कर रहा हूं। मैं उदाहरण कोड में जो कर रहा हूं उसे जोड़ दूंगा। – mattv

+0

मेरे अपडेट देखें। – Aliostad

+0

अच्छा, विशेषता के उचित उपयोग पर मुझे सूचित करने के लिए धन्यवाद - दुर्भाग्यवश, मेरे मुद्दे को अभी भी संबोधित नहीं करता है। हालांकि अब अपवाद के लिए टूटने के बाद एप्लिकेशन फिर से शुरू होने पर परीक्षण पास हो जाता है! – mattv

1

mattv,

क्यों इस परीक्षण सेवा का उपयोग करने के लिए किया करता दूरस्थ रूप से? मैं आपके कोड को देखता हूं:

ResponseObject resp = GetServiceClient().DoSomething(req); 

किसी भी तरह से सेवा क्लाइंट प्राप्त हो रहा है, न कि सेवा उदाहरण स्वयं।मैं यूनिट परीक्षणों के लिए सीधे सेवा कंक्रीट कक्षा का परीक्षण करने की सलाह दूंगा।

हालांकि, अगर आप को इस परिदृश्य को की आवश्यकता है, तो क्या आपने अपवाद को पकड़ने और परीक्षण चलाने की कोशिश नहीं की है? क्या यह वही परिणाम देता है?

और वैसे, आप को पकड़ने के लिए की जरूरत है और निम्नलिखित पैटर्न का उपयोग rethrow यदि:

try { 
    //Do something 
} 
catch(SomeException e) { 
    //Do something with e 
    throw 
} 
+1

ठीक है, सेवा को दूरस्थ रूप से एक्सेस करने का विचार डब्ल्यूसीएफ ग्राहकों के आसपास केंद्रित कुछ स्केलेबिलिटी फीचर्स का परीक्षण करना है, इसलिए मैं रिमोट कनेक्शन कैसे बनाया जाता है, इसका परीक्षण कवरेज रखना चाहता हूं। मुझे यकीन नहीं है कि यह करने का यह सबसे अच्छा तरीका है, वास्तव में, लेकिन मुझे कोड कवरेज पसंद है ... यदि मुझे अपवाद नहीं मिलता है, तो परीक्षण विफल रहता है, जो कुछ परीक्षणों के लिए सटीक है, लेकिन में दूसरों, मैं वास्तव में परीक्षण करना चाहता हूं कि त्रुटि फेंक दी गई थी। – mattv