Ответ 1
Я решил, что лучший способ - изменить ожидаемую стратегию. Вместо
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;
}
}