Как издеваться над ObjectContext или ObjectQuery в Entity Framework?

.net-3.5 entity-framework mocking unit-testing

Вопрос

Как смоделировать ObjectContext или ObjectQuery в Entity Framework?

Популярные ответы

Базовые макеты могут создавать только макеты для интерфейсов и абстрактных классов (но только для абстрактных / виртуальных методов).

Поскольку ObjectContext не является ни абстрактным, ни интерфейсным, его не так легко высмеять. Однако, поскольку контейнер конкретной модели генерируется как частичный класс (если вы используете конструктор), вы можете извлечь необходимые методы / свойства из него в интерфейс. В вашем коде вы можете использовать только тот интерфейс, который вы можете потом высмеивать.

С ObjectQuery это немного проще, поскольку он имеет базовый интерфейс (например, IQueryable), который в основном содержит все необходимые операции, которые вам обычно нужны (и требуются для LINQ). Таким образом, вы должны представить IQueryable вместо ObjectQuery в вашей бизнес-логике, и вы можете создать макет для этого интерфейса.

Другой альтернативой является скрытие всей логики, связанной с доступом к данным, на отдельном уровне (с минимальной логикой), тестирование этого уровня с помощью интеграционных тестов и макет, чтобы иметь возможность модульного тестирования других уровней.

Существуют инструменты (я знаю только TypeMock ), которые используют профилирующие перехватчики .NET для генерации макетов. Эти инструменты не ограничиваются макетами интерфейсов или абстрактных классов, но с их помощью вы можете макетировать практически все, включая не виртуальные и статические методы. С таким инструментом вам не нужно менять свою бизнес-логику, чтобы допустить насмешку.

Хотя этот подход иногда полезен, вы должны знать, что извлечение зависимостей из интерфейсов (IoC) не только полезно для имитации, но также уменьшает зависимости между вашими компонентами, что также имеет и другие преимущества.

Лично мне больше всего нравится Rhino.Mocks из бесплатных инструментов, но мы также используем TypeMock , который также является отличным продуктом (но за него нужно платить).



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему