Пользовательское соответствие с Moq - PullRequest
3 голосов
/ 20 августа 2010

Я пытаюсь быть хорошим гражданином TDD при разработке приложения. Я использую Moq, и у меня возникла небольшая проблема с хранилищем.

В моем хранилище есть метод Find:

public IEnumerable<T> Find(Expression<Func<T, bool>> where)
        {
            return _objectSet.Where(where);
        }

Затем я пытаюсь настроить макет хранилища:

mock.Setup(m => m.Find(c => c.ConferenceID == conferenceID))
                .Returns(ConferenceTestObjectContainer.CreateConferences().Where(c => c.ConferenceID == conferenceID).ToList());

Тест будет работать, если я проверяю макет непосредственно в тесте, но если я внедряю макет в свой производственный код (в данном случае страницу ASP.NET) и тестирую метод страницы, он не работает ,

Джастин Этередж рассматривает проблему в своем посте здесь . Проблема в том, что компаратор между вызовом и настройкой не может так хорошо обрабатывать выражения.

Проблема, с которой я столкнулся, связана с его функцией сравнения:

public static Expression<Func<T,bool>> AreEqual<T>(Expression<Func<T,bool>> expr)
{
    return Match<Expression<Func<T, bool>>>
        .Create(t => t.ToString() == expr.ToString());            
}

Это вызывает ошибку компилятора:

Аргументы типа для метода 'Moq.Match.Create (System.Predicate)' не могут быть выведены из использования. Попробуйте указать аргументы типа явно.

Я понимаю, что компилятор не может определить тип "T", но я не знаю, как это исправить. Хороший мистер Этередж сделал эту работу, но я не понимаю, что я делаю неправильно.

ТИА.

Ответы [ 2 ]

0 голосов
/ 23 января 2012

Почему бы вам не использовать somenthing так:

public static Expression<Func<T,bool>> AreEqual<T>(Expression<Func<T,bool>> expr)
{
    return Match.Create<Expression<Func<T, bool>>>(t => t.ToString() == expr.ToString());            
}

Таким образом, я работаю и с универсальными.

0 голосов
/ 21 августа 2010

ОК, так что этот вопрос идет Tumblweed ...

Для справки, я обошел эту проблему, выведя новый Entity-специфичный репозиторий и добавил метод FindById (), который прекрасно работает.

...