2012-01-13 17 views
9

मैं सी # यूनिट परीक्षणों में फेंकने वाले अपवाद को कैसे अनुकरण कर सकता हूं?यूनिट परीक्षणों में अपवाद फेंकने का अनुकरण कैसे करें?

मैं अपने कोड का 100% कवरेज प्राप्त करने में सक्षम होना चाहता हूं, लेकिन मैं अपवादों के साथ कोड का परीक्षण नहीं कर सकता। उदाहरण के लिए मैं हो सकता है कि एक शक्ति faluire अनुकरण नहीं कर सकता।

उदाहरण के लिए:

public void MyMethod() 
{ 
    try 
    { 
    ... 
    } 
    catch(OutOfMemoryException e) 
    { 
    ... 
    } 
    catch(RandomErrorFromDatabaseLayer e) 
    { 
    ... 
    } 
} 

मैं अपवाद के किसी भी प्रकार इस विधि में है और पकड़ा जाना चाहिए कि अनुकरण करने के लिए सक्षम होना चाहते हैं।
क्या कोई पुस्तकालय है जो इस मामले में मेरी मदद कर सकता है?

संपादित करें 1: मोक के साथ मैंने जो कुछ पूछा, उसे पूरा करने में कोई मदद?

+1

आपका कोड नमूना वास्तव में आपकी समस्या की व्याख्या नहीं करता:

आपका परीक्षण तो (कुछ बनाया अप आवश्यकता जब अपवाद फेंक दिया जाता है परीक्षण करने के लिए) तुच्छ है। आप बिजली की विफलता का अनुकरण क्यों नहीं कर सकते? क्या आप ऐसी स्थितियों को 'इंजेक्ट' करने की कोशिश कर रहे हैं जो उल्लिखित अपवादों को फेंकने का कारण बनेंगे? असली मुद्दा क्या है? –

+0

हाँ, बस http://stackoverflow.com/a/8851628/79379 की तरह, लेकिन डेटाबेस डेटाबेस को अनुकरण करने के लिए डेटाबेस को नष्ट करने के बिना। –

उत्तर

8

आपको उन वस्तुओं को बनाने के लिए वास्तविक वस्तुओं के लिए एक नकली वस्तु बनाने की आवश्यकता है जो इन अपवादों को फेंक सकता है। तो फिर तुम परीक्षण है कि बस कुछ इस तरह कर रहे हैं बना सकते हैं:

public void ExampleMethod() 
{ 
    throw new OutOfMemoryException(); 
} 

आप एक निर्भरता इंजेक्शन ढांचे यह बहुत आसान नकली कोड के साथ वास्तविक कोड की जगह बनाता उपयोग कर रहे हैं।

5

आपको क्या चाहिए stub - एक वस्तु जो आपके कोड के लिए कुछ शर्तों को अनुकरण करेगी। परीक्षण उद्देश्यों के लिए, आप आम तौर पर स्टब (या अन्य प्रकार की फ़ेक्ड ऑब्जेक्ट) के साथ वास्तविक ऑब्जेक्ट कार्यान्वयन को प्रतिस्थापित करते हैं। आपके मामले में, पर विचार करें:

public class MyClass 
{ 
    private IDataProvider dataProvider; 

    public void MyMethod() 
    { 
     try 
     { 
      this.dataProvider.GetData(); 
     } 
     catch (OutOfMemoryException) 
     { 
     } 
    } 
} 

अब, वर्ग आप कुछ स्तर पर कॉन्फ़िगर किया जाना चाहिए परीक्षण कर रहे हैं - ताकि आप आसानी से टोंटदार के साथ वास्तविक DataProvider कार्यान्वयन की जगह ले सकता/एक नाटक किया जब परीक्षण (जैसे आप ने कहा, आप डॉन ' टी आपके डीबी को नष्ट करना नहीं चाहता - कोई भी नहीं चाहता!)। यह उदाहरण के लिए कन्स्ट्रक्टर इंजेक्शन (या वास्तव में, कोई अन्य dependency injection तकनीक) द्वारा हासिल किया जा सकता है।

[Test] 
public void MyMethod_DataProviderThrowsOutOfMemoryException_LogsError() 
{ 
    var dataProviderMock = new Mock<IDataProvider>(); 
    dataProviderMock 
     .Setup(dp => dp.GetData()) 
     .Throws<OutOfMemoryException>(); 
    var myClass = new MyClass(dataProviderMock); 

    myClass.MyMethod(); 

    // assert whatever needs to be checked 
} 
संबंधित मुद्दे