У меня есть общий репозиторий, и я пытаюсь преобразовать .Returns в выражение, но он отказывается... Мой код следующий:
public RepositoryTest()
{
IList<MockObjectSet> mocks = new List<MockObjectSet>()
{
new MockObjectSet { FirstName = "Beta", LastName = "Alpha", Mobile = 12345678 },
new MockObjectSet { FirstName = "Alpha", LastName = "Beta", Mobile = 87654321 }
};
var mockRepository = new Mock<IRepository<MockObjectSet>>();
mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>()))
.Returns((Expression<Func<MockObjectSet, bool>> predicate) => mocks.Where(predicate).ToList());
}
Это просто сказать
Delegate System.Func<System.Collections.Generic.IEnumerable<expWEBCRM.Tests.Repositories.MockObjectSet>> does not take 1 arguments
Заранее спасибо!
Ответ 1 · рейтинг 6 · Igor Zevaka
Вам нужно явно указать параметры типа перегрузки Returns следующим образом:
mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>()))
.Returns<Expression<Func<MockObjectSet, bool>>>(predicate => mocks.Where(predicate).ToList());
ИЗМЕНИТЬ Репозиторий берет выражение и использует его в файле IQueryable. Имитация источника данных на самом деле является IEnumerable. Разница в интерфейсе LINQ заключается в том, что один берет лямбду, а второй - выражение:
IQueryable<T>.Where(Expression<Func<T,bool>>);
IEnumerable<T>.Where(Func<T,bool>);
В этом сценарии происходит попытка вызова IEnumerable.Where с помощью Expression<Func<T,bool>>. Самый простой способ исправить это - иметь исходную коллекцию как IQueryable:
public RepositoryTest()
{
IQueryable<MockObjectSet> mocks = new List<MockObjectSet>()
{
new MockObjectSet { FirstName = "Beta", LastName = "Alpha", Mobile = 12345678 },
new MockObjectSet { FirstName = "Alpha", LastName = "Beta", Mobile = 87654321 }
}.AsQueryable();
var mockRepository = new Mock<IRepository<MockObjectSet>>();
mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>()))
.Returns<Expression<Func<MockObjectSet, bool>>>(predicate => mocks.Where(predicate).ToList());
}