2017-02-23 112 views
1

Я пробовал следовать за guide с помощью Entity Framework и Moq, чтобы издеваться над моим контекстом, чтобы протестировать мой репозиторий.Получить IQueryable из Moq mockset

Я в настоящее время возникают проблемы тестирования мой GetSingle запрос из моего репозитория:

public Customer GetSingle(int id, HotelBookingContext context = null, params Expression<Func<Customer, object>>[] navigationProperties) 
{ 
    using (var tempContext = context ?? new HotelBookingContext()) 
    { 
     IQueryable<Customer> dbQuery = tempContext.Set<Customer>(); 

     foreach (Expression<Func<Customer, object>> navigationProperty in navigationProperties) 
      dbQuery = dbQuery.Include(navigationProperty); 

     return dbQuery 
       .AsNoTracking() 
       .FirstOrDefault(x => x.Id == id); 
    } 
} 

с помощью следующего теста:

public void GetSingle_QueryingASingleCustomer_ReturnsASingleCustomer() 
{ 
    var cus = new Customer() { Email = "testMail", Name = "testName", Id = 1 }; 
    var customer = new List<Customer> {cus}.AsQueryable(); 

    var mockSet = new Mock<DbSet<Customer>>(); 
    mockSet.As<IQueryable<Customer>>().Setup(m => m.Provider).Returns(customer.Provider); 
    mockSet.As<IQueryable<Customer>>().Setup(m => m.Expression).Returns(customer.Expression); 
    mockSet.As<IQueryable<Customer>>().Setup(m => m.ElementType).Returns(customer.ElementType); 
    mockSet.As<IQueryable<Customer>>().Setup(m => m.GetEnumerator()).Returns(customer.GetEnumerator()); 

    var mockContext = new Mock<HotelBookingContext>(); 
    mockContext.Setup(m => m.Customers).Returns(mockSet.Object); 

    var temp = _customerRepository.GetSingle(cus.Id, mockContext.Object); 
    Assert.AreEqual(temp.Name, cus.Name); 
    Assert.AreEqual(temp.Email, cus.Email); 
    Assert.AreEqual(temp.Id, cus.Id); 
} 

Если я отладки кода я замечаю, что в функции GetSingleIQueryabledbQuery остается null и поэтому не может использоваться в операторе возврата.

Почему это?

Однако, если я запускаю его с реальным контекстом, он отлично работает.

+0

Это потому, что в настройке вы устанавливаете свойство '.Customers', а не' .Set () '. Moq не имеет понятия, что делать с этим, исходя из текущей настройки. – Nkosi

ответ

1

Это потому, что в настройке вы установили свойство .Customers на издевательский контекст, а не на функцию .Set<Customer>(). Moq не имеет понятия, что делать с этим, исходя из текущей настройки.

mockContext.Setup(m => m.Set<Customer>()).Returns(mockSet.Object); 

Вышеуказанная настройка должна соответствовать ожидаемому поведению тестируемого метода в его текущем формате.

Другой мудрый, если это установка ...

mockContext.Setup(m => m.Customers).Returns(mockSet.Object); 

... то вам необходимо обновить метод испытываемого к ...

IQueryable<Customer> dbQuery = tempContext.Customers; 

для теста осуществлять в ожидается.

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