2009-04-29 4 views
0

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

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

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

ответ

3

Посмотрите на Dependency Injection (DI) и Inversion контейнеров управления (МОК). По сути, вы создадите интерфейс, который может реализовать новый объект-макет DB, а затем среда DI будет внедрять вашу макетную БД при выполнении тестов и реальную БД при запуске приложения.

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

0

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

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

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

1

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

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

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

Harsha

Смежные вопросы