Удаление тестовой базы данных во время модульной проверки

Dov спросил: 12 мая 2018 в 04:36 в: c#

Я работаю над некоторыми автоматическими тестами (используя MSTest), которые создают уникальную базу данных для каждого тестового примера, изолируя каждый тест от результатов предыдущих тестов (и тестовых прогонов). Для этого я использую инструменты Microsoft DACFx. Как я могу удалить тестовую базу данных во время проверки, поэтому я не собираю огромную коллекцию? Экземпляр SQL Server работает на localhost.

Я просмотрел документацию DACFx и не смог найти способ удалить всю базу данных.

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

using (var dacpac = DacPackage.Load(path)) {
    instance.Deploy(dacpac, databaseName, upgradeExisting: true);
}

1 ответ

Есть решение
JayV ответил: 12 мая 2018 в 04:53

Я делаю то же самое с созданием тестовой базы данных в TestInitialize, а затем удаляя ее во время TestCleanup. Однако для меня база данных всегда называется "UnitTesting". Вы можете использовать некоторую подстановку строк, если ваши уникальные имена сгенерированы в коде C #

В TestCleanup Я выполняю этот скрипт

USE [master];DECLARE @kill varchar(8000) = '';  
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'   FROM sys.dm_exec_sessions WHERE database_id  = db_id('UnitTesting')EXEC(@kill);/****** Object:  Database [UnitTesting]    Script Date: 12/05/2018 23:06:16 ******/
USE [master]IF EXISTS(SELECT * FROM SYS.DATABASES WHERE NAME = 'UnitTesting')
    DROP DATABASE [UnitTesting]

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

Dov ответил: 12 мая 2018 в 05:02
Спасибо, мне, возможно, придется использовать это, но я надеялся не использовать сценарий. Я уточню свой вопрос, чтобы указать это.
Dov ответил: 12 мая 2018 в 06:05
Как вы запускаете этот скрипт? Я обнаружил, что части kill не работают, так как я получаю сообщение об ошибке, что я не могу убить активное соединение. Но просто использование части после того, как комментарий работал как шарм. Благодаря!
JayV ответил: 12 мая 2018 в 06:20
Я запускаю стандартный код C # для выполнения ... using (SqlConnection conn = new SqlConnection) ... используя (SqlCommand command = new SqlCommand) ... command.ExecuteNonQuery (); Это блок кода, который я использовал во многих различных проектах тестирования модулей, все в MSTest, у меня есть права dbo_owner на сервере