Moq - Mock Generic Repository - PullRequest
       3

Moq - Mock Generic Repository

4 голосов
/ 27 ноября 2010

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

4 голосов
/ 27 ноября 2010

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...