Замените возвращаемое значение с помощью общего репозитория

У меня есть общий репозиторий для MongoDB.

Это мой метод Get:

public IList<TEntity> Get<TEntity>(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null) where TEntity : class, new()
{
    var collection = GetCollection<TEntity>();

    var query = Query<TEntity>.Where(filter);
    var entity = collection.FindAs<TEntity>(query).ToList();

    return entity;
}

Когда я пытаюсь это сделать, я получаю сообщение об ошибке:

IList<Login> (где Логин - это мой бизнес-объект) не содержит определения ReturnsForAnyArgs,

[TestMethod]
public void CheckIfUserNameExits_IfUserNameDoesNotExist_ReturnFalse()
{
    Login login = null;
    Task<IList<Login>> logl = null;
    // _mongoDAL.Get<Arg.Any<Login>()>(Arg.Any<Expression<Func<TEntity, bool>>>).ReturnsForAnyArgs
    //_mongoDAL.When(x => x.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>())).ReturnsForAnyArgs(logl);
    _mongoDAL.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>()).ReturnsForAnyArgs(logl);
}

Любые предложения о том, как его смоделировать, чтобы я мог установить возвращаемое значение, которое я хочу в моем модульном тесте?

2 ответа

Решение

Проблема вызвана тем, что вы передали неправильный тип ReturnsForAnyArgs вызов. Такое поведение одинаково, если вы звоните Returns, или же ReturnsForAnyArgs,

Ваш Get метод определяется как возвращающий IList<TEntity>, На ваш первоначальный вопрос вы возвращаетесь logl, который имеет тип Task<IList<Login>> (обратите внимание на Task оборачивая IList). В вашем решении, однако, вы вместо этого передаете loginList, который является List<T>, который реализует IList<T> следовательно, ваш код компилируется. Итак, в качестве альтернативы вы могли бы использовать:

_mongoDAL.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>())
         .ReturnsForAnyArgs(loginList);

Ошибка компиляции, которую вы получаете изначально, немного загадочна. Полное сообщение об ошибке:

Ошибка CS1928: "System.Collections.Generic.IList" не содержит определения "ReturnsForAnyArgs" и наилучшей перегрузки метода расширения "NSubstitute.SubstituteExtensions.ReturnsForAnyArgs(System.Threading.Tasks.Task, T, params T[])" имеет несколько неверных аргументов

Первая половина сообщения об ошибке выглядит так, как будто он указывает на отсутствующий метод расширения. Однако в действительности проблема заключается в том, что он не соответствует ни одному из перегруженных методов и поэтому выбирает наиболее близкий и показывает, как он не соответствует.

Как правило, вы получите вторую ошибку, которая поможет указать, что это ваша проблема. Что-то вроде этого:

ошибка CS1929: аргумент экземпляра: невозможно преобразовать из 'System.Collections.Generic.IList' в 'System.Threading.Tasks.Task>>'

Решил это.

List<Login> loginList = new List<Login>()
            {
            };

     _mongoDAL.Get<Login>(Arg.Any<Expression<Func<Login, bool>>>()).Returns(loginList);

Не знаю, почему с просто возвращается, это работает.

Другие вопросы по тегам