关于IDataReader我遇到了Moq和Automapper的问题.
我在stackoverflow上找到了一个例子并修改了代码.
我在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); //...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。