Я пытаюсь быть хорошим гражданином 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", но я не знаю, как это исправить. Хороший мистер Этередж сделал эту работу, но я не понимаю, что я делаю неправильно.
ТИА.