2012-04-27 7 views
4

IDataReader와 관련하여 Moq 및 Automapper에 문제가 있습니다. stackoverflow에서 예제를 발견하고 코드를 수정했습니다.IDataReader에서 Moq 사용에 관한 문제를 해결하는 방법

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 인입니다. 독자가 [ "name"]처럼 조롱받은 독자의 가치를 확인하면 조롱은 정확하지만 Automapper 솔기는 문제가 발생하도록 "Alingsås"값을 얻었습니다. 나는 그것을 모의하는 나의 방법에 전달한 객체 목록을 사용한다.

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 호출 방법이 아닙니까? 아니면 그렇지?

무엇이 잘못 될 수 있습니까?

+0

당신이 당신의'MockTester.MockIDataReader' 방법 의 전체 코드를 게시 할 수 : 당신이 그것을 작동하게하는 몇 가지 추가 방법 설정에 필요한 Automapper의 소스를 확인

? – nemesv

+0

전체 코드가 추가되었습니다. 얼마 전 여기에 다른 게시물의 일부가 있습니다. 디버그 할 때 x [name] 값이 설정됩니다. – RockJohan

+0

Nice :) 문제를 재현하기 위해 만든 'MockIDataReader'와 거의 같습니다. 기본적으로 다른 인덱서를 설치해야하며, 잠시 후에 내 대답을 게시 할 것입니다. – nemesv

답변

2

Automapper 내부적으로 그래서 당신은 대신 Item[String]의에 Setup를 호출하는 데 필요한 int indexerIDataReader의 사용합니다.

//... 
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); 
//... 
+0

Nice;) ty nemesv 내 문제를 해결했습니다. 나는 이것이 사실이라고 생각했지만 확실치 않았고 int에 대한 정확한 테스트를 얻지 못했습니다. 내 foreach를 당신의 것으로 바꿨고 나의 테스트가 녹색으로 바뀌 었습니다 : D +++++++ 1 – RockJohan

+0

감사합니다.이 테스트가 정말 도움이되었습니다! –