Как смоделировать вызов службы с помощью лямбда-выражения с помощью Moq - PullRequest
0 голосов
/ 23 января 2020

Я использую 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());

1 Ответ

0 голосов
/ 23 января 2020

Быстрый просмотр кода показывает, что AllSearchBy ожидает массив из Expression<Func<T, bool>>, но ваша установка указывает одно выражение.

Возможно, попробуйте что-то подобное?

mockRepository
  .Setup(m => m.AllSearchBy(It.IsAny<Expression<Func<Rate_End_HSB_SLC, bool>>[]>()))
  .Returns(predicates => predicates
    .Aggregate(
      rateEndHsbSlcTable, 
      (source, predicate) => source.Where(predicate.Compile())).AsQueryable());
...