NUnit

2014-09-29 9 views
6

में फेंक दिया गया अपवाद कैसे संभालें मैंने अपने एमवीसी प्रोजेक्ट के लिए सी # में यूनिट टेस्ट क्लास लिखा है।NUnit

टेस्ट विधि

[Test] 
    public void To_Add_DocumentStatusIsNull_ThrowsInvalidOperationException_ServiceTest() 
    { 
     try 
     { 

     _IDocumentStatusRepositoryMock = new Mock<IDocumentStatusRepository>(); 
     _unitOfWorkMock = new Mock<IUnitOfWork>(); 

     DocumentStatusService documentStatusService = new 
     DocumentStatusService(_unitOfWorkMock.Object, 
      _IDocumentStatusRepositoryMock.Object); 

     DocumentStatus documentStatus; 
     documentStatus = null; 

     _IDocumentStatusRepositoryMock.Setup(m => m.Add(documentStatus)); 
     documentStatusService.Add(documentStatus); 

     Assert.Pass(); 

     } 
     catch (Exception e) 
     { 
      throw new Exception(e.Message); 
     } 
    } 

पीछा कर रहा है और सेवा विधि

public virtual void Add(TEntity entity) 
    { 
     try 
     { 

     if (entity == null) 
     { 
      throw new ArgumentNullException("entity"); 
     } 
     _repository.Add(entity); 

     } 
     catch (Exception e) 
     { 
      throw new Exception(e.Message); 
     } 
    } 

अब यह परीक्षण विधि केवल सेवा वर्ग फेंक दिया ArgumentNullException.So कैसे ArgumentNullException संभाल करने की वजह से पारित नहीं पीछा कर रहा है या यह परीक्षण कैसे पास करें?

कृपया किसी को भी मदद

+3

आपकी सेवा विधि में 'नई अपवाद (ई.मेजेज) फेंकने का उद्देश्य क्या है? आप मूल अपवाद क्यों नहीं उठाएंगे? मैं उस 'try'/'catch' सेटअप के लिए कोई उपयोग नहीं देख सकता ...? और * निश्चित रूप से * एनयूनीट परीक्षण में 'try'/'catch' में कोई बिंदु नहीं है - NUnit स्वचालित रूप से अपवादों को त्रुटियों के रूप में मानता है, जब तक कि आपने ज्ञात अपेक्षित अपवाद –

+0

क्षमा नहीं किया है, यह किसी अन्य उद्देश्य के लिए लिखा गया है और आप ठीक है यह गलत है.अब मैं जानना चाहता हूं कि मेरी टेस्ट विधि में ArgumentNullException को कैसे संभालना है? –

उत्तर

5

आप यह देखना होगा कि ArgumentNullException काम कर रहा है कोशिश कर रहे हैं (जो: यह वर्तमान में नहीं है)। तो यह लग रहा है कि आप की तरह हैं:

[Test, ExpectedException(typeof(ArgumentNullException), ExpectedMessage = @"Value cannot be null. 
Parameter name: entity")] 
public void To_Add_DocumentStatusIsNull_ThrowsInvalidOperationException_ServiceTest() 
{ 
    _IDocumentStatusRepositoryMock = new Mock<IDocumentStatusRepository>(); 
    _unitOfWorkMock = new Mock<IUnitOfWork>(); 

    DocumentStatusService documentStatusService = new 
    DocumentStatusService(_unitOfWorkMock.Object, 
     _IDocumentStatusRepositoryMock.Object); 

    DocumentStatus documentStatus; 
    documentStatus = null; 

    _IDocumentStatusRepositoryMock.Setup(m => m.Add(documentStatus)); 
    documentStatusService.Add(documentStatus); 
} 

...

public virtual void Add(TEntity entity) 
{ 
    if (entity == null) 
    { 
     throw new ArgumentNullException("entity"); 
    } 
    _repository.Add(entity); 
} 
+0

मैंने आपके कोड का परीक्षण किया है जो ऊपर दिया गया है लेकिन कोई बदलाव नहीं किया गया है –

+0

क्षमा करें मार्क इसके काम कर रहा है !!!! –

+0

उत्तर –

1

मैं यह सोचते हैं रहा हूँ: कोड इस इकाई परीक्षा उत्तीर्ण नहीं करना चाहिए पर देख रहे हैं। किसी सूची में एक न्यूल जोड़ना ज्यादातर मामलों में एक इच्छित व्यवहार नहीं है।

मुझे 2 विकल्प दिखाई देते हैं: ए) आपको टेस्ट मेटोड में एक कोशिश/पकड़ जोड़ना चाहिए।

try 
{ 
    _IDocumentStatusRepositoryMock.Setup(m => m.Add(documentStatus)); 
    documentStatusService.Add(documentStatus); 
} 
catch (Exception) 
{ 
    Assert.Fail(); // or nothing is expected behaviour 
} 

बी) टेस्ट विधि से प्रयास/पकड़ ब्लॉक निकालें ताकि आप अपवाद को निगल न सकें। (हर टेस्ट जो ऐसा नहीं करता विफल रहता है या एक जोर या एक unhandeled अपवाद thows स्वचालित रूप से गुजरता है)

+0

के रूप में चिह्नित कर सकता हूं हां, यह यूनिट परीक्षण पास नहीं होना चाहिए, लेकिन मुझे इसका व्यवहार नहीं करना चाहिए। और मैंने आपके समाधानों की कोशिश की जो ऊपर दी गई हैं, कुछ भी नहीं बदला है। कृपया कोई अन्य समाधान? –

-1

ArgumentNullException के लिए परीक्षण

आप निकालते हैं बीमार की सलाह दी करने के लिए

catch (Exception e) 
{ 
    throw new Exception(e.Message); 
} 

अपने कोड से परीक्षण किया जा सकता है (वर्तमान catch त्रुटि के संदर्भ को खो देता है, और स्टैक ट्रेस को तोड़ता है, नीचे देखें), आपका परीक्षण Assert.Throws<ArgumentNullException>():

में आमंत्रण को लपेटने जितना आसान हो सकता है
[Test] 
public void PassingANullEntityToAddMustThrowArgumentNullException() 
{ 
    var documentStatusService = new DocumentStatusService(...); 
    Assert.Throws<ArgumentNullException>(() => documentStatusService.Add(null)); 
} 

पुन: आपका अपवाद संचालक

आपकी सेवा कोड में, एक अपवाद को पकड़ने और यह rethrow के रूप में आप किया है, के रूप में इस स्टैक ट्रेस खो देंगे (कभी नहीं उदा _repository.Add(entity); भी फेंक सकता है।)।

catch (Exception e) 
    { 
     throw new Exception(e.Message); 
    } 

बेहतर: तुम भी e.Message फेंकने के रूप में इस मूल अपवाद में पहले से ही है

बुरा (स्टैक ट्रेस और भीतरी अपवाद की तरह अतिरिक्त जानकारी के साथ) द्वारा किसी भी ख़ास नहीं कर पा रहे हैं आप को पकड़ने और करते हैं कुछ मान के साथ rethrow, एक आंतरिक अपवाद के रूप में मूल लपेट:

catch (SqlException ex) 
{ 
    throw new Exception("Some value add here", ex); 
} 

या यदि आप बस में अवरोध डालने और प्रचार करने की अनुमति कर रहे हैं:

catch (SqlException) 
{ 
    // Do some logging 
    throw; 
} 

मेरे लिए सबसे अच्छा अपवाद प्रचार करना होगा, जब तक आप या तो मूल्य जोड़ते हैं, या इसे संभालने नहीं देते।