4

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メソッド呼び出しではないように見えますか?またはそれは?

ここで何が間違っている可能性がありますか?

4

1 に答える 1

2

Automapperは内部でのintインデクサーを使用するため、の代わりにそれIDataReaderを呼び出す必要があります。SetupItem[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);
//...
于 2012-05-11T13:33:32.737 に答える