Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: ebbОтветов: 1

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

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

unit-testingmocking

Ответы

Ответ 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());

}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы