Moq — фиктивный общий репозиторий

У меня есть общий репозиторий, и я пытаюсь преобразовать .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

Заранее спасибо!


person ebb    schedule 26.11.2010    source источник


Ответы (1)


Вам нужно явно указать параметры типа перегрузки 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());

}
person Igor Zevaka    schedule 26.11.2010
comment
Идеальный! Но теперь появляется другая ошибка: «System.Collections.Generic.IList‹expWEBCRM.Tests.Repositories.MockObjectSet›» не содержит определения для «Where» и лучшей перегрузки метода расширения «System.Linq.Enumerable.Where‹TSource ›(System.Collections.Generic.IEnumerable‹TSource›, System.Func‹TSource,int,bool›)» имеет недопустимые аргументы - person ebb; 27.11.2010