EF4.1 DbSet против EF4 ObjectContext и модульное тестирование - PullRequest
2 голосов
/ 20 июня 2011

В настоящее время у меня есть проект, который я начал с EF4, и я возвращаюсь и добавляю тестирование после этого. Я использую шаблоны EF4 POCO T4 с первым контекстом модели (базы данных). Я использую универсальные репозитории для своей логики ЦАП и единицу работы для постоянства.

Тем не менее, я сталкиваюсь с некоторыми проблемами, понимающими, как макет ObjectContext / ObjectSet. Я рассмотрел пример FakeObjectSet<T> из этой статьи , но он все еще оставляет некоторые вещи, такие как автоматически увеличивающиеся идентификаторы и откаты транзакций.

Итак, я пытаюсь найти хороший дизайн EF, который все еще будет полностью тестируемым модулем.

У меня вопрос: решает ли EF4.1 DbSet множество проблем с модульным тестированием EF4? Есть ли какие-нибудь хорошие исчерпывающие статьи для разработки решений EF4.1, которые можно полностью протестировать?

Кроме того, имейте в виду, что мне нужно решение на основе модели.

Заранее спасибо.

1 Ответ

6 голосов
/ 20 июня 2011

Полностью имитирующее поведение смоделированного слоя не является предметом юнит-тестирования. Суть модульного тестирования заключается в том, что макетированный слой просто работает. Юнит тест проверяет проверенный метод, а не макет. Вы просто проверите, что был вызван правильный метод на макете, и, возможно, вы настроите некоторые обратные вызовы для изменения переданных данных, если ваша бизнес-логика ожидает некоторых значений. Пример:

У вас есть бизнес-метод вставки записи в базу данных и использования сущности и ее идентификатора после вставки. Макет IObjectSet будет настроен на:

  • Установить ожидание того, что AddObject был вызван только один раз - вы можете установить ожидаемый экземпляр в проверке
  • Вы можете определить обратный вызов для AddObject, чтобы установить Id для некоторого значения и использовать его позже в тесте

DbSet не будет иметь никакого значения - это просто оболочка вокруг ObjectSet с похожим поведением. На мой взгляд, нет эффективного способа заставить издеваться вести себя как настоящий EF. Усилия, необходимые для создания макета с базой данных EF +, имитирующей поведение, будут намного больше, чем усилия для всего вашего приложения! Это больше не будет насмешкой, это будет фальшивый провайдер EF.

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

...