2010-08-16 5 views
5

ОТВЕТ: Я не очищал свои ConnectionPools.Не удается удалить базу данных после тестирования устройства

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

SetUp:

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

Тест:

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

Teardown:

  1. SqlConnection.ClearAllPools();
  2. отброшенных база данных 'TEMP_NUnit'.

Оригинальный вопрос находится под складкой.


Привет Все

тест сценарий:

SetUp:

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

Тест:

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

Teardown:

  1. Отбросьте базу данных 'TEMP_NUnit'.

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

Cannot drop database "TEMP_NUnit" because it is currently in use.

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

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

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

ответ

5

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

SqlConnection.ClearAllPools(); 

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

Это привело меня довольно количество горя, прежде чем :)

+0

Бинго! Спасибо чувак. –

0

могли бы хотеть рассмотреть Michael Feathers Unit Testing Rules:

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

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

Очень хорошая ссылка. Я все равно буду писать этот тест, потому что мне нужно что-то вроде этого, которое может быстро проверить, работает ли код обновления в разных сценариях. Однако идея двоичной дробь была хорошей. Я отделяю этот тест от своей DLL. Thanaks. –

+1

Обратите внимание, что в приведенной выше статье также указано, что «нам нужны оба типа тестов, но эти« чистые »модульные тесты недооценены». Так что (не единичный) тест, который говорит с базой данных, в порядке. –