Проблемы с издевательством над репозиторием с Moq

#c#-4.0 #moq #repository-pattern

#c #-4.0 #moq #репозиторий-шаблон

Вопрос:

Я пытаюсь издеваться над своим репозиторием с помощью Moq. Я пытаюсь макетировать все методы запроса в моем репозитории. Мне удалось издеваться над методом, возвращающим all of для типа, который я издевался.

Пример:

 mockProductRepo.Setup(x => x.GetAll()).Returns(products.AsQueryable());
  

Однако у меня возникла проблема с издевательством над методом, который использует другой метод. Например, мой метод «filterBy» возвращает вызов моего метода «GetAll» с предложением Where, которое принимает выражение

Пример: Метод репозитория

 public virtual IQueryable<T> FilterBy(Expression<Func<T, bool>> expression)
{
   return GetAll().Where(expression);
}
  

Фишка в том, что я надеялся издеваться над всеми методами в репозитории в вспомогательном классе:

 public static IRepository<Product> MockProductRepository(params Product[] products) {
        var mockProductRepo = new Mock<IRepository<Product>>();
        mockProductRepo.Setup(x => x.GetAll()).Returns(products.AsQueryable());
        mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns(products.AsQueryable().Where(It.IsAny<Expression<Func<Product, bool>>>()));
        return mockProductRepo.Object;
}
  

Итак, вместо метода filterBy, описанного выше, есть ли способ настроить его на вызов другого издевательского метода, а не так, как у меня в приведенном выше примере?

Обновить

Я попробовал настройку:

 mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns(mockProductRepo.Object.GetAll().Where(It.IsAny<Expression<Func<Product, bool>>>()));
  

И всегда выдает ошибку, что «Значение не может быть нулевым. Параметр: предикат». Из того, что я понимаю о трассировке стека, он жалуется, потому что я не передаю предикат «Where». Я не уверен, как в настройках обозначить выражение, переданное в метод filterBy, которое будет использоваться в фильтре Where.

Ответ №1:

Я понял это сам.

 mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns((Expression<Func<Product,bool>> filter) => mockProductRepo.Object.GetAll().Where(filter));