Смоделируйте вызов IQueryable, используя moq - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь создать мой репозиторий, который определяется как:

public IQueryable<TEntity> GetAll(Expression<Func<TEntity, bool>> predicate = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null, bool disableTracking = true)

Есть ли способ сделать это?Я хочу, чтобы запрос выполнялся с использованием фиктивных данных, которые я предоставляю в репозитории.Я не уверен, как сказать MOQ, что когда я вызываю GetAll, я хочу, чтобы он все еще выполнял переданный запрос, но делаю это вместе с набором данных, который я предоставляю.так что это не идет в БД, но против ложного набора, который я настроил.Я могу создать данные, они содержат 12 записей, но я хочу, чтобы вызов getall moq выполнил свой запрос и отфильтровал его только к двум, которые должны быть возвращены.

Фактический сервис, где происходит вызовэто:

var list = await _unitOfWork.GetRepository<CASE_ACTIVITY>().GetAll(predicate: x => x.SM_SITE_ID == siteId && x.CMS_USER_ID == userId
            && x.IS_DELETED == "N" && x.Appointment.IS_DELETED == "N" && x.Appointment.IS_ARCHIVED == "N" && x.IS_ARCHIVED == "N"
            && ((x.Appointment.APPOINTMENT_DATETIME.HasValue && x.Appointment.APPOINTMENT_DATETIME.Value.Date == DateTime.Today.Date)
                || (!x.Appointment.APPOINTMENT_DATETIME.HasValue && x.ACTIVITY_STATUS_ID == _appSettings.CASE_ACTIVITY_STATUS_ID_PENDING)))
            .Include(x => x.Activity_Lookup).Include(x => x.Appointment).ThenInclude(x => x.Cms_Client).Include(x => x.Cms_Case)
            .ToListAsync();

1 Ответ

1 голос
/ 20 мая 2019

Предполагая, что у вас достаточно контроля над методом GetRepository(), чтобы it вернул ваш репозиторий, имитировать сам метод довольно просто (если немного многословно). Я просто сбросил метод GetAll в интерфейс под названием IRepository, и вот как выглядит макет. Внутри метода Returns у вас есть доступ к каждому из параметров для выполнения или игнорирования по вашему усмотрению.

  var mock = new Moq.Mock<IRepository>();
  mock.Setup(a => a.GetAll<int>(It.IsAny<Expression<Func<int, bool>>>(), It.IsAny<Func<IQueryable<int>, IOrderedQueryable<int>>>(), It.IsAny<Func<IQueryable<int>, IIncludableQueryable<int, object>>>(), It.IsAny<bool>()))
    .Returns<Expression<Func<int, bool>>, Func<IQueryable<int>, IOrderedQueryable<int>>, Func<IQueryable<int>, IIncludableQueryable<int, object>>, bool>((param1, param2, param3, param4) =>
    {
      return new[] { 1, 2, 3 }.AsQueryable();
    });

  var result = mock.Object.GetAll<int>();

Отсюда мы не сможем помочь, не увидев больше кода. В абстрактных терминах, однако, вы возьмете свой mock.Object (который имеет тип IRepository) и передадите его в любую коллекцию, из которой извлекает GetRepository (). Также обратите внимание, конечно, что я использовал int для универсального параметра - вы замените его любым типом, который вы используете. Может быть возможно создать макет, который принимает общие параметры, но, надеюсь, в этом не будет необходимости!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...