2015-10-14 2 views
14

में पास करना EF SaveChanges विधि को ओवरराइड करके C# में कुछ व्यावसायिक तर्क करने का प्रयास कर रहा है।
विचार यह है कि इस क्षेत्र को अपडेट करने के लिए इस क्षेत्र में कुछ उन्नत गणनाएं होंगी। और यह क्षेत्र कुछ अन्य क्षेत्रों के उप-वर्ग से कम है, आप उन्नत व्यापार जंक जानते हैं।परीक्षण ईएफ सहेजें परिवर्तन Modifiers परीक्षण। DbPropertyValues ​​

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

void Update(object entity, DbPropertyValues currentValues, DbPropertyValues originalValues); 

तरह लग रहा है जब पूर्ण एफई में यह बुला यह खूबसूरती से काम करता है

लिखा है परीक्षण करने के लिए नहीं कर पा रहे
public override int SaveChanges() 
    { 
     var added = ChangeTracker.Entries().Where(p => p.State == EntityState.Added).Select(p => p.Entity); 
     var updated = ChangeTracker.Entries().Where(p => p.State == EntityState.Modified).Select(p => p); 

     var context = new ChangeAndValidationContext(); 

     foreach (var item in added) 
     { 
      var strategy = context.SelectStrategy(item); 
      strategy.Add(item); 
     } 

     foreach (var item in updated) 
     { 
      var strategy = context.SelectStrategy(item); 
      strategy.Update(item.Entity, item.CurrentValues, item.OriginalValues); 
     } 
     return base.SaveChanges(); 
    } 

हम यह नहीं समझ सकते कि डीबीप्रोपर्टी वैल्यूज को मूल या हमारे परीक्षणों के लिए अपडेट किया गया है। कृपया उस विधि का परीक्षण करने के तरीके को जानने में हमारी सहायता करें।

उत्तर

4

मैंने तय कर लिया बेहतर तरीका बदलने के लिए क्या रणनीति की उम्मीद थी। इसके बजाय

void Update(object entity, DbPropertyValues currentValues, DbPropertyValues originalValues); 

की

मैं इसे स्वीकार

void Update(object entity, Dictionary<string, object> currentValues, Dictionary<string, object> originalValues); 

कौन सा मतलब मैं मान अद्यतन विधि

foreach (var item in updated) 
{ 
     var strategy = context.SelectStrategy(item); 
     strategy.Update(item.Entity, item.CurrentValues.ValuesToValuesDictionary(), item.OriginalValues.ValuesToValuesDictionary()); 
} 

के लिए पारित बदल तो मैं बनाया यही कारण है कि विस्तार विधि बनाया

public static class DbPropertyValueExtensions 
{ 
    public static Dictionary<string, object> ValuesToValuesDictionary(this DbPropertyValues vals) 
    { 
     var retVal = new Dictionary<string, object>(); 
     foreach (var propertyName in vals.PropertyNames) 
     { 
      if (!retVal.ContainsKey(propertyName)) 
      { 
       retVal.Add(propertyName, vals[propertyName]); 
      } 

     } 
     return retVal; 
    } 
} 

जिसका मतलब था कि उन परीक्षणों में मेरे परीक्षणों को पारित करने की आवश्यकता है।

[Test] 
    public void DateLastModifiedUpdatesOnUpdate() 
    { 
     //Arrange 
     var toTest = LossFactoryHelper.Create(); 
     var lossCheckAndValidationAddStrategy = new LossChangeAndValidationStrategy(); 
     var now = DateTime.UtcNow; 
     var originalValues = toTest.GetValuesNow(); 
     //Act 


     toTest.mny_deductible = -1; 
     var currentValues = toTest.GetValuesNow(); 
     lossCheckAndValidationAddStrategy.Update(toTest, originalValues, currentValues); 

     //Assert 
     Assert.GreaterOrEqual(toTest.clc_DateLastModified, now); 
    } 

और एक्सटेंशन विधि मदद करने के लिए खत्म हो गया शब्दकोश बनाने के लिए नहीं के रूप में मूल्यों का स्नैपशॉट प्राप्त और

public static class ReflectionToGetCurrentValuesExtension 
{ 
    public static Dictionary<string, object> GetValuesNow(this object obj) 
    { 
     var retVal = new Dictionary<string, object>(); 
     var type = obj.GetType(); 
     PropertyInfo[] properties = type.GetProperties(); 
     foreach (PropertyInfo property in properties) 
     { 
      if (property.CanRead && property.CanWrite) 
      { 
       if (!retVal.ContainsKey(property.Name)) 
       { 
        retVal.Add(property.Name, property.GetValue(obj)); 
       } 
      } 
     } 
     return retVal; 
    } 
} 
से अधिक
5

यदि आपके पास विजुअल स्टूडियो 2012 अपडेट 2+ है, तो आप अपने टेस्ट प्रोजेक्ट में प्रोजेक्ट संदर्भ पर राइट-क्लिक करके EntityFramework के लिए "असेंबली फर्जी असेंबली" कर सकते हैं।

एक बार जोड़ा गया, तो आप System.Data.Entity.Infrastructure.Fakes.ShimDbPropertyValues के उदाहरण बना सकते हैं जो पूरी तरह से आपके नियंत्रण में हैं। जैसे

var shim = new System.Data.Entity.Infrastructure.Fakes.ShimDbPropertyValues(); 
shim.ItemGetString = s => "Hello, World!"; 

और जब GetString कि नकली/शिम DbPropertyValues पर कहा जाता है कि यह वापस आ जाएगी "नमस्कार, दुनिया!"।

अधिक यहाँ विवरण: https://msdn.microsoft.com/en-us/library/hh549175.aspx

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