Модульное тестирование с использованием сгенерированного кода DAL

Я использую генератор кода (CodeSmith с шаблоном.NetTiers) для генерации всего кода DAL. Я пишу модульные тесты для своего кода (бизнес-уровень), и эти тесты запускаются довольно медленно. Проблема в том, что для каждого теста я сбрасываю базу данных, чтобы иметь чистое состояние. Кроме того, поскольку я делаю много тестов, кажется, что задержка операций с базой данных сводится к довольно небольшой задержке.

Все операции с БД выполняются через DataRepository класс, который генерируется.NetTiers. Знаете ли вы, есть ли способ сгенерировать (или написать сам) mock-DataRepository, который бы использовал хранилище в памяти вместо базы данных?

Таким образом, я смогу использовать этот фиктивный репозиторий в своих модульных тестах, значительно ускоряя их, фактически ничего не меняя в моем текущем коде!

3 ответа

Решение

Взгляните на инъекцию зависимостей (DI) и инверсию контейнеров управления (IOC). По сути, вы создадите интерфейс, который может реализовать новый фиктивный объект БД, а затем инфраструктура DI внедрит вашу фиктивную БД при выполнении тестов и реальную БД при запуске вашего приложения.

Существует множество бесплатных библиотек с открытым исходным кодом, которые вы можете использовать, чтобы помочь вам. Поскольку вы находитесь на C#, одна из новых и будущих библиотек DI - Ninject. Есть и много других. Проверьте эту статью в Википедии для других и описание высокого уровня.

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

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

Существуют различные фреймворки, которые вы можете использовать, например, Rhino Mock, Moq, typemock. (В моем проекте я использую макет Rhino для макета слоя DAL и модульного тестирования Business Layer in Isolation)

Harsha

Некоторые из наших модульных тестов используют данные, извлеченные из XML, которые были сгенерированы из базы данных, для имитации доступа к базе данных. Классы DAL заменены на фиктивные, поскольку все они хранятся в контейнере DI.

Создание XML-кода - это пользовательский код, если вы найдете для этого решение с открытым исходным кодом, я буду рад его услышать.

Редактировать после ответа Стефана: я вспоминаю другую команду, использующую SQL CE для своей тестовой базы данных

Другие вопросы по тегам