Я сейчас играю с .NET MVC и пишу несколько юнит-тестов. У меня есть хранилище интерфейса, которое выглядит так:
public interface IRepository<TEntity> : IDisposable where TEntity : class
{
IQueryable<TEntity> GetAll();
TEntity Single(Expression<Func<TEntity, bool>> predicate);
}
Я издевался над методом GetAll следующим образом:
_mockRepository.Setup(x => x.GetAll()).Returns(
new List<Post>
{
new Post { Title = "Test Post 1" },
new Post { Title = "Test Post 2" }
}.AsQueryable());
Теперь я не уверен, как бы посмеялся над методом Single, так как в нем есть параметр, содержащий выражение, которое я хочу оценить.
Спасибо
b3n
Edit:
Я изменил код на:
_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<Post, bool>>>()))
.Returns( (Expression<Func<Post, bool>> expr) => new List<Post> {
new Post { PostId = 1, Title = "Test Post 1", Created = DateTime.Now },
new Post { PostId = 2, Title = "Test Post 2", Created = DateTime.Now }
}.Where(expr));
Но сейчас я получаю следующую ошибку:
'System.Collections.Generic.List' не содержит определения 'Где' и наилучшей перегрузки метода расширения 'System.Linq.Queryable.Where (System.Linq.IQueryable, System.Linq.Expressions.Expression> ) 'имеет недопустимые аргументы.
Является ли это даже лучшим подходом для этого или единственный метод должен возвращать только новое сообщение, даже не учитывая переданное выражение?
Редактировать 2:
Это рабочий результат.
_mockRepository.Setup(x => x.Single(It.IsAny<Expression<Func<Post, bool>>>())).Returns(
(Expression<Func<Post, bool>> expr) =>
new List<Post>
{
new Post { PostId = 1, Title = "Test Post 1", Created = DateTime.Now },
new Post { PostId = 2, Title = "Test Post 2", Created = DateTime.Now }
}.Single(expr.Compile()));