2017-02-17 45 views
0
public List<Models.Employer> GetEmployers() 
{ 

    List<Models.Employer> empList = new List<Models.Employer>(); 
    var list = DataCentralDbContext.Employers.ToList(); 
    foreach (Data.Web.Employer e in list) 
    { 
     empList.Add(Mapper.Map<Data.Web.Employer, Models.Employer>(e)); 

    } 
    return empList; 
} 

Я хочу протестировать вышеуказанный метод, который имеет зависимость от AutoMapper. Ниже приведен код метода испытаний.Тест AutoMapper для сопоставления IQueryable

var data = new List<Data.Web.Employer> 
{ 
    new Data.Web.Employer {EmployerID= new Guid(), EmployerName = "BBB", AddressLine1="address 1", AddressLine2="address 2", City="City1",State="we",IsActive=true, PostalCode="12345" }, 
    new Data.Web.Employer {EmployerID= new Guid(), EmployerName = "ZZZ",AddressLine1="address 1", AddressLine2="address 2", City="City1",State="we",IsActive=true, PostalCode="12345" }, 
    new Data.Web.Employer {EmployerID= new Guid(), EmployerName = "AAA",AddressLine1="address 1", AddressLine2="address 2", City="City1",State="we",IsActive=true, PostalCode="12345" }, 
}.AsQueryable(); 

var mockSet = new Mock<DbSet<Data.Web.Employer>>(); 
mockSet.As<IQueryable<Data.Web.Employer>>().Setup(m => m.Provider).Returns(data.Provider); 
mockSet.As<IQueryable<Data.Web.Employer>>().Setup(m => m.Expression).Returns(data.Expression); 
mockSet.As<IQueryable<Data.Web.Employer>>().Setup(m => m.ElementType).Returns(data.ElementType); 
mockSet.As<IQueryable<Data.Web.Employer>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator()); 

var mockContext = new Mock<IDataCentralDbContext>(); 
mockContext.Setup(c => c.Employers).Returns(mockSet.Object); 


var mapperMock = new Mock<IMapper>(); 
mapperMock.Setup(m => m.Map<CSF.Data.Web.Employer, CSF.Models.Employer>(It.IsAny<CSF.Data.Web.Employer>())); 


var emplogic = new EmployerLogic(mockContext.Object, mapperMock.Object); 

var result = emplogic.GetEmployers(); 

Я верну правильный граф, но все объекты Null. Я попытался использовать Returns, но он возвращает только один объект. Можно ли вернуть коллекцию?

+0

Я предлагаю вам использовать настоящий класс 'Automapper', потому что он работает так же хорошо и в UT, как и в коде. В конце концов, вы не тестируете его, вы проверяете свой код, который проверяет правильность вызова '.Map <>'. – zaitsman

ответ

0

Настройте Returns вручную делать отображение в тесте

mapperMock 
    .Setup(m => m.Map<CSF.Data.Web.Employer, CSF.Models.Employer>(It.IsAny<CSF.Data.Web.Employer>())) 
    .Returns((CSF.Data.Web.Employer e) => new CSF.Models.Employer { 
     EmployerID = e.EmployerID, 
     EmployerName = e.EmployerName, 
     //....other code removed for brevity 
    }); 

Кроме того, когда насмешливый переписчик использовать функцию.

mockSet 
    .As<IQueryable<Data.Web.Employer>>() 
    .Setup(x => x.GetEnumerator()).Returns(() => data.GetEnumerator()); 

разрешить несколько перечислений, как прохождение только .Returns(data.GetEnumerator()) позволит только один проход через перечисление с используются до метода ToList расширения.

Я узнал, что трудный путь после бесчисленных часов пытается понять, почему мои тесты не удались.

1

Не издевайтесь над IQueryable. Не издевайтесь над IMapper. Не издевайтесь над DbContext. Это единичный тест, который обеспечивает нулевое значение, есть много возможностей для подкрылья. Предоставьте им фасад или что я делаю, просто напишите интеграционный тест, который использует реальные вещи. Это обеспечивает ценность.

 Смежные вопросы

  • Нет связанных вопросов^_^