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であるということです。reader ["name"]のようなモックリーダーから値を確認すると、「Alingsås」値が取得されたため、モックは正しいですが、Automapperシームに問題があります。すべてをモックするメソッドに渡すオブジェクトのリストを使用します。
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);
コードは正常に機能し、例外はスローされませんが、マッパーは値のないオブジェクトを提供します。デバッガーでリフレクションコードが機能していることを確認できますが、x ["Name"]がIDataReaderからのAutomapperメソッド呼び出しではないように見えますか?またはそれは?
ここで何が間違っている可能性がありますか?