关于IDataReader我遇到了Moq和Automapper的问题.
我在stackoverflow上找到了一个例子并修改了代码.
public static IDataReader MockIDataReader<T>(List<T> ojectsToEmulate) where T : class
{
var moq = new Mock<IDataReader>();
// This var stores current position in 'ojectsToEmulate' list
var count = 0;
moq.Setup(x => x.Read())
// Return 'True' while list still has an item
.Returns(() => count < ojectsToEmulate.Count)
// Go to next position
.Callback(() => count++);
var properties = typeof (T).GetProperties();
foreach (PropertyInfo t in properties)
{
var propName = t.Name;
moq.Setup(x => x[propName]).Returns(() => ojectsToEmulate[count].GetType().GetProperty(propName).GetValue(ojectsToEmulate[count],null));
}
return moq.Object;
}
}
我的映射:
Mapper.Configuration.CreateMap(typeof(IDataReader), typeof(IEnumerable<T>));
var result = Mapper.Map<IDataReader, IEnumerable<T>>(reader);
我在这里遇到的问题是我的结果有1个结果是cityModel但它的所有属性都是null.如果我检查我的模拟读者的值,如读者[“名称”],我得到了“Alingsås”值,因此模拟是正确的,但Automapper接缝有问题.
我使用了一个对象List,我传递给我的方法,模仿它.
var cityModel = new CityModel();
cityModel.Name = "Alingsås";
cityModel.Id = "SE";
cityModel.CountryId = "SE";
var cityModels = new List<CityModel>();
cityModels.Add(cityModel);
_fakeReader = MockTester.MockIDataReader(cityModels);
代码工作正常,没有抛出异常,但映射器给了我一个没有的对象
valules.我可以在调试器中看到我的反射代码可以工作,但它像我一样接缝
x [“Name”]不是从IDataReader调用Automapper的方法吗?或者是吗?
这可能有什么不对?
最佳答案 Automapper在内部使用
int indexer的IDataReader,因此您需要在其上调用Setup而不是Item [String].
检查Automapper的源代码,您需要设置一些其他方法才能使其工作:
//...
var index = 0;
foreach (PropertyInfo t in properties)
{
var propName = t.Name;
int index1 = index; // avoid access to modified closure
moq.Setup(x => x.GetFieldType(index1)).Returns(t.PropertyType);
moq.Setup(x => x.GetName(index1)).Returns(propName);
moq.Setup(x => x[index1])
.Returns(ojectsToEmulate[count]
.GetType()
.GetProperty(propName).GetValue(ojectsToEmulate[count], null));
index++;
}
moq.Setup(x => x.FieldCount).Returns(properties.Length);
//...