2014-10-28 3 views
8

पर निर्भर करता है मेरे पास निम्न सहायक विधि है, जो DbEntityValidationException से सत्यापन संदेश लेता है। हमें इसकी आवश्यकता है क्योंकि सत्यापन के विवरण डिफ़ॉल्ट रूप से अपवाद में नहीं जोड़े जाते हैं।किसी ऑब्जेक्ट के लिए यूनिट टेस्ट कैसे बनाएं जो DbEntityEntry

public static string LogMessageDbEntityValidationException(DbEntityValidationException ex) 
{ 
    StringBuilder error = new StringBuilder(); 

    error.AppendLine("Validation Error details for DbEntityValidationException throw: "); 

    foreach (var validationErrors in ex.EntityValidationErrors) 
    { 
     foreach (var validationError in validationErrors.ValidationErrors) 
     { 
     error.AppendLine(string.Format("Property: {0} , Error: {1}", 
          validationError.PropertyName, validationError.ErrorMessage)); 
     } 
    } 

    return error.ToString(); 
} 

मैं एक मुद्दा यूनिट टेस्ट बनाने का प्रयास कर आई है, विशेष रूप से मैं एक DbEntityValidationResult नहीं बना सकते क्योंकि यह DbEntityEntry, जो एक सार्वजनिक निर्माता नहीं है का एक उदाहरण की आवश्यकता है।

यहाँ टूट गया है यूनिट टेस्ट, यह DbEntityEntry बनाने पर विफल रहता है:

public void LogMessageDbEntityValidationExceptionTest() 
{ 
    string errorMessage = "Unit Test Error Message"; 
    string expected = "Not valid data."; 
    List<DbEntityValidationResult> entityValidationResults = new List<DbEntityValidationResult>(); 
    List<DbValidationError> errorList = new List<DbValidationError>(); 
    DbEntityValidationException ex; 

    errorList.Add(new DbValidationError("TestProperty", expected)); 

    entityValidationResults.Add(new DbEntityValidationResult(new System.Data.Entity.Infrastructure.DbEntityEntry(), errorList)); 

    ex = new DbEntityValidationException(errorMessage, entityValidationResults); 
    string actual = Common.LogMessageDbEntityValidationException(ex); 

    Assert.IsTrue(actual.Contains(expected)); 
} 

ध्यान दें, DbEntityEntry एक इंटरफ़ेस को लागू नहीं करता है, तो मैं एक नकली/नकली उपयोग नहीं कर सकते।

+0

क्या आपको कभी इस समस्या का समाधान मिला है? – user1535568

उत्तर

1

कुछ नकली ढांचे जैसे मोक विधि विधि पुनर्निर्देशन आपको इंटरफेस के बिना कक्षाओं का नकल करने की इजाजत देता है। http://www.codenutz.com/unit-testing-mocking-base-class-methods-with-moq/

के साथ ऐसा कहा जाता है कि यह एक अच्छा प्रोग्रामिंग अभ्यास नहीं है क्योंकि आप अपने परीक्षण कोड को उस ढांचे पर हमेशा के लिए निर्भर करेंगे और आप इकाई परीक्षण के कुछ डिज़ाइन लाभ खो देंगे।

आप क्या कर सकते हैं अपनी अवांछित वस्तु को लपेटने और उस पर एक इंटरफ़ेस जोड़ने के लिए प्रॉक्सी क्लास लिखना है, फिर आप सामान्य कक्षा का उपयोग करने पर हर बार प्रॉक्सी क्लास का उपयोग करते हैं।

+1

दुर्भाग्यवश अवांछित वस्तु को ईएफ कोड में दफनाया गया है। मुझे बहुत अधिक कोड के चारों ओर एक रैपर लिखना होगा। – Josh

+0

आप वस्तु के लिए निजी डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करने के लिए ऑब्जेक्ट प्रारंभकर्ता का उपयोग करने का भी प्रयास कर सकते हैं। http://msdn.microsoft.com/en-us/library/bb397680.aspx इसके साथ मोक का उपयोग करके कहा गया है कि आप इसे करने के लिए ढांचे का उपयोग करने में सक्षम होना चाहिए। –

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