Я использую Moq, чтобы попытаться смоделировать метод, который имеет лямбда-выражение в качестве необязательного параметра и вызывает базу данных.
Это реальный метод, который я пытаюсь смоделировать
public IQueryable<T> AllSearchBy<T>(params Expression<Func<T, bool>>[] search) where T : class
{
IQueryable<T> result = _context.Set<T>();
foreach (var item in search)
{
result = result.Where(item);
}
return result;
}
Вот мой репозиторий moq, настроенный
var mockRepository = new Mock<IRepository>();
var rateEndHsbSlcTable = new List<Rate_End_HSB_SLC>
{
new Rate_End_HSB_SLC
{
Limit = 10000,
DwellingAgeMin = 0,
DwelilngAgeMax = 25,
Premium = 22M
},
new Rate_End_HSB_SLC
{
Limit = 10000,
DwellingAgeMin = 26,
DwelilngAgeMax = 50,
Premium = 45M
}
};
mockRepository.Setup(m => m.AllSearchBy(It.IsAny<Expression<Func<Rate_End_HSB_SLC, bool>>>()))
.Returns((Expression<Func<Rate_End_HSB_SLC, bool>> predicate) => rateEndHsbSlcTable.Where(predicate.Compile()).AsQueryable());
IRateServices rateService = new RateServices(mockRepository.Object, new HelperServices(mockRepository.Object));
А вот вызов в коде, который Я тестирую, что выдает ошибку (я заменил переменные жесткими значениями для простоты)
var test = _repository.AllSearchBy<Rate_End_HSB_SLC>(x => x.Limit == 10000 && x.DwellingAgeMin <= 19 && x.DwelilngAgeMax >= 19);
Это компилируется, но дает мне следующее исключение при запуске
System.ArgumentException: объект типа 'System.Linq.Expressions.Expression 1[System.Func
2 [Twico.DataAccess.Rate_End_HSB_SL C, System.Boolean]] []' не может быть преобразован в тип 'System.Linq.Expressions.Expression. 1[System.Func
2 [Twico.DataAccess.Rate_End_HSB_SL C, System.Boolean]].
Есть идеи, что я делаю неправильно?
Редактировать: используя ответ ibebbs, я получил его для работы с этим синтаксисом!
mockRepository.Setup(m => m.AllSearchBy(It.IsAny<Expression<Func<Rate_End_HSB_SLC, bool>>[]>()))
.Returns((Expression<Func<Rate_End_HSB_SLC, bool>>[] predicates) => predicates.Aggregate(rateEndHsbSlcTable, (source, predicate) => source.Where(predicate.Compile()).ToList()).AsQueryable());