Замените возвращаемое значение с помощью общего репозитория
У меня есть общий репозиторий для 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);
Не знаю, почему с просто возвращается, это работает.