Быстрая очистка базы данных NHibernate - PullRequest
5 голосов
/ 22 июня 2010

Я использую NHibernate для ORM, и все работает нормально.

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

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

Существует ли команда DELETE_ALL, которая очищает все таблицы, которую я могу использовать в NHibernate?

Chris

РЕДАКТИРОВАТЬ: Короткое обновление, я решил пойти по пути SQLite, нет проблем, чтобы изменить это с NHibernate. Есть некоторые подводные камни, я использую этот конфиг, и он работает. В противном случае вы можете получить ошибки «таблица не найдена» из-за того, что nHibernate закрывает соединение во время сеанса, что приводит к «потерянной» базе данных ...

Для вашего удобства: скопируйте и вставьте ...

.Database(SQLiteConfiguration.Standard.ConnectionString("Data Source=:memory:;Version=3;New=True;Pooling=True;Max Pool Size=1;")  
                       .Raw("connection.release_mode", "on_close"))
                        .Mappings(obj => obj.AutoMappings.Add(_config.APModel));

Ответы [ 5 ]

9 голосов
/ 22 июня 2010

Удалите и заново создайте базу данных.Вы можете использовать schemaexport:

var export = new SchemaExport(config);
export.Drop(false, true);
export.Create(true, true);

Sql lite в памяти работает быстрее для тестов, чем «обычная» база данных, но недостатком является то, что в производственном процессе диалект sql-lite может отличаться от диалекта sql.

2 голосов
/ 23 июня 2010

Я бы порекомендовал вам проверить ndbunit .Он не специфичен для NHibernate, но в прошлом я использовал его для тестирования проектов NHibernate, и он хорошо работает.По сути, он предоставляет функции для очистки базы данных, предварительного заполнения тестовыми данными или восстановления их в известные состояния после каждого теста.Вам просто нужно предоставить XSD схемы базы данных и, необязательно, некоторые данные XML для предварительного заполнения.

Мне кажется, я впервые увидел это в серии снимков экрана Summer of NHibernate ,так что проверьте их, чтобы увидеть, как они используются.

1 голос
/ 22 июня 2010

Вы не пишете модульные тесты (т.е. тесты, которые тестируют один модуль), вы пишете интеграционные тесты, в которых модули взаимодействуют (например, с вашей базой данных).

Часть инфраструктуры тестирования может выполнять sqlСценарий, который выполняет одно из следующих действий:

  1. Удалите БД и воссоздайте.
  2. Обрежьте все таблицы.

В идеале вы хотите поставить немногоработы по абстрагированию БД, особенно если у вас есть NH, что делает его намного проще, чем некоторые другие фреймворки.

0 голосов
/ 24 июня 2010

На всякий случай, если Drop / Create DB не удовлетворяет вашим потребностям (например, если БД содержит объект, о котором NHibernate не знает, например, SP, функции и т. Д.), Вы всегда можете создать резервную точку с пустой БД и после того, как вы закончили тестирование просто восстановите к этому моменту

0 голосов
/ 22 июня 2010

Используйте базу данных в памяти, такую ​​как SQLite, и настраивайте в ней необходимые данные перед каждым тестом. Первоначальная настройка занимает немного времени, но после этого каждый тест выполняется очень быстро, и вы можете убедиться, что вы начинаете с чистого листа. У Айенде есть несколько постов в блоге о том, как его настроить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...