Не удается удалить базу данных после юнит-теста - PullRequest
5 голосов
/ 16 августа 2010

ОТВЕТ: Я не очищал свои ConnectionPools.

Решенный сценарий:

SetUp:

  1. Проверьте, чтобы увидетьесли база данных «TEMP_NUnit» (SQL Server 2005) существует на локальном экземпляре
  2. Если он существует, удалите его.
  3. Создайте новую пустую базу данных с именем «TEMP_NUnit».

Тест:

  1. Создание компонента «Обновление базы данных».
  2. Убедитесь, что основные свойства компонента по умолчанию установлены правильно.
  3. Наведите компонент напустая база данных и вызов .Upgrade ()
  4. Убедитесь, что обновление действительно сработало

TearDown:

  1. SqlConnection.ClearAllPools();
  2. Dropбаза данных 'TEMP_NUnit'.

Исходный вопрос находится ниже сгиба.


Hi All

Сценарий тестирования:

SetUp:

  1. Проверьте, существует ли база данных TEMP_NUnit (SQL Server 2005) на локальном экземпляре
  2. Если он существует, удалите его.
  3. Создайте новую пустую базу данных с именем «TEMP_NUnit».

Тест:

  1. Создание компонента «Обновление базы данных».
  2. Проверкачто основные свойства компонента по умолчанию установлены правильно.
  3. Наведите компонент на пустую базу данных и вызовите .Upgrade ()
  4. Убедитесь, что обновление действительно работает

TearDown:

  1. Удалите базу данных 'TEMP_NUnit'.

Все будет хорошо, пока я не достигну фазы TearDown.Я всегда получаю следующую ошибку:

Невозможно удалить базу данных "TEMP_NUnit", поскольку она используется в данный момент.

Это сбивает с толку меня, потому что я закрываю (явновызов conn.Close в операторах finally) и правильное удаление (с помощью оператора using) всех моих объектов DbConnection.К моменту появления TearDown в базе данных «TEMP_NUnit» не должно быть ничего запущенного.

Если я закрою NUnit, а затем снова открою его, шаг 2 в SetUp всегда работает первым.

Я не уверен, что я делаю здесь не так.Любые указатели в правильном направлении будут оценены.

Ответы [ 2 ]

5 голосов
/ 16 августа 2010

Ах, но вы забыли сделать эту маленькую вещь перед удалением базы данных:

SqlConnection.ClearAllPools();

По умолчанию пул соединений будет поддерживать соединение с базой данных, даже если вы закрывали его ранее.Выполнение SqlConnection.ClearAllPools() фактически приведет к закрытию всех соединений.Затем вы можете подключиться к master и удалить временную базу данных.

Раньше это приносило мне много горя:)

0 голосов
/ 16 августа 2010

Возможно, стоит рассмотреть Правила модульного тестирования Майкла Перса :

Тест не является модульным тестом, если:

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