В настоящее время я пишу модульные тесты для реализации моего репозитория в приложении MVC4. Чтобы издеваться над контекстом данных, я начал с принятия некоторых идей из этого сообщения, но теперь я обнаружил некоторые ограничения, которые заставляют меня сомневаться в том, возможно ли это правильно mock IQueryable
.
В частности, я видел некоторые ситуации, когда тесты проходят, но код не работает, и я не смог найти способ издеваться над поведением, которое вызывает этот сбой.
Например, следующий фрагмент используется для выбора объектов Post
, которые входят в предопределенный список категорий:
var posts = repository.GetEntities<Post>(); // Returns IQueryable<Post>
var categories = GetCategoriesInGroup("Post"); // Returns a fixed list of type Category
var filtered = posts.Where(p => categories.Any(c => c.Name == p.Category)).ToList();
В моей тестовой среде я попытался издеваться над posts
с помощью упомянутой выше реализации поддельной DbSet
, а также создав экземпляры List
of Post
и преобразовывая ее в IQueryable
с помощью AsQueryable()
способ расширения. Оба этих подхода работают в условиях тестирования, но код фактически не работает в производстве, за исключением следующего:
System.NotSupportedException : Unable to create a constant value of type 'Category'. Only primitive types or enumeration types are supported in this context.
Хотя проблемы LINQ, подобные этому, достаточно легки для исправления, реальная задача заключается в их поиске, учитывая, что они не раскрываются в тестовой среде.
Я нереалистичен в ожидании того, что я могу высмеять поведение реализации Entity Framework IQueryable
?
Спасибо за ваши идеи,
Тим.