#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));