Настройка репозитория Moq метода FindBy с помощью Func <> - PullRequest
1 голос
/ 19 ноября 2011

Я новый moq и боролся со следующим.

Я смоделировал список List с именем _mockedThingsList

Я хотел бы, чтобы Moq FindBy моего IRepository возвратился из этого списка mocks на основе запроса linq, предоставленного в моем сервисе, которыйпроверяется

То, что у меня сейчас есть, выдает исключение и выглядит следующим образом.Что не так, пожалуйста?

mock.Setup(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
            .Returns((enumThingType tp) => _mockedThingsList.Where(x => x.ThingType == tp));

Интерфейс хранилища выглядит следующим образом:

interface IRepository<T>
{
    IEnumerable<T> FindAll();

    IEnumerable<T> FindBy(Func<T, bool> predicate);
    void Add(T item);
    void Remove(T item);

    bool Contains(T item);
    int Count { get; }
}

И сервис, который будет проверен с этим макетом

class ThingService
{
    private readonly IRepository<IThing> _repository;

    public ThingService(IRepository<IThing> repository)
    {
        _repository = repository;
    }


    public List<IThing> GetThings1()
    {
        return _repository.FindBy(y => y.ThingType == enumThingType.WhatEver).ToList();
    }

    public List<IThing> GetThings2()
    {
        return _repository.FindBy(y => y.Name == "What ever").ToList();
    }
}

Ответы [ 2 ]

5 голосов
/ 20 ноября 2011

Возможно, мне не хватает некоторого контекста, но мне кажется, что вы слишком издеваетесь.Какова цель издеваться над списком?Вы можете легко вернуть конкретный список и использовать его для своего теста.

0 голосов
/ 19 ноября 2011

Я могу ошибаться в своей интерпретации, но подпись FindBy возвращает IEnumerable.Принимая во внимание, что при заглушке вы возвращаете делегата.Я думаю, из-за этого несоответствия в типе возврата, вы столкнулись с этой проблемой.Для целей тестирования, почему бы вам просто не вернуть правильный список из метода Returns, например

(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
            .Returns(// return a proper List of type T);

Произошло необработанное исключение типа 'System.ArgumentException' в mscorlib.dll Дополнительная информация: Объекттип 'System.Func`2 [ThingNamespace.IThing, System.Boolean]' не может быть преобразован в тип 'ThingNamespace.enumThingType'

.Когда вы объявляете заглушку в FindBy, вы указываете параметр типа как: Func.Теперь в вашем методе Returns входной параметр должен быть точно такого же типа.Попробуйте следующий код:

Func<IThing, bool> func => (IThing thing) => thing.ThingType == tp;

(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
            .Returns((func) => _mockedThingsList.Where(func));
...