[英]Integration testing with LocalDB
In order to write integration tests against some data access code for my application, I've written an abstract class to use for the database integration tests . 为了针对我的应用程序编写针对某些数据访问代码的集成测试,我编写了一个用于数据库集成测试的抽象类。
It creates a fresh instance of the database using LocalDB then tears it down once complete. 它使用LocalDB创建一个新的数据库实例,然后在完成后将其撕下。
However for some reason, the DROP DATABASE
command always fails with the following exception: 但是由于某种原因, DROP DATABASE
命令始终失败,并出现以下异常:
Cannot drop database "Integration_DataAccess" because it is currently in use.
Why is this? 为什么是这样? Is there a better approach for using LocalDB for integration database testing? 有没有更好的方法来使用LocalDB进行集成数据库测试?
Below is the code for my abstract database integration testing class: 下面是我的抽象数据库集成测试类的代码:
using System;
using ProjectName.DataAccess.EmailSubscription;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using NUnit.Framework;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.IO;
namespace ProjectName.DataAccess.Tests.IntegrationTests
{
public abstract class IntegrationTestBase
{
private const string DatabaseConnNameEmpty = "DbDSNEmpty";
private const string DatabaseConnName = "DbDSN";
private const string DatabaseName = "Integration_DataAccess";
[TestFixtureSetUp]
public void SetupTempDatabase()
{
// Create database (drop first, just in case)
var connection =new SqlConnection(ConfigurationManager.ConnectionStrings[DatabaseConnNameEmpty].ConnectionString);
var server = new Server(new ServerConnection(connection));
server.ConnectionContext.ExecuteNonQuery( string.Format( "IF EXISTS(select * from sys.databases where name='{0}') DROP DATABASE [{0}]", DatabaseName));
server.ConnectionContext.ExecuteNonQuery(string.Format("CREATE DATABASE {0}", DatabaseName));
// Run database creation script
using (var sr = new StreamReader(@"IntegrationTests\DatabaseSetup.txt"))
{
var sql = sr.ReadToEnd();
ExecuteNonQuery(sql);
}
}
[TestFixtureTearDown]
public void RemoveTempDatabase()
{
// Drop database
ExecuteNonQuery(string.Format("DROP DATABASE [{0}]", DatabaseName));
}
#region private methods
protected static void ExecuteNonQuery(string sql)
{
// Thanks to http://weblogs.asp.net/jgalloway/archive/2006/11/07/Handling-_2200_GO_2200_-Separators-in-SQL-Scripts-_2D00_-the-easy-way.aspx
var connection = new SqlConnection(ConnectionString());
var server = new Server(new ServerConnection(connection));
server.ConnectionContext.ExecuteNonQuery(sql);
connection.Close();
}
protected static string ConnectionString()
{
return ConfigurationManager.ConnectionStrings[DatabaseConnName].ConnectionString;
}
protected static DataTable Select(string sql)
{
using (var conn = new SqlConnection(ConnectionString()))
{
var adapter = new SqlDataAdapter(sql, conn);
var data = new DataTable();
adapter.Fill(data);
return data;
}
}
protected static int ExecuteScalar(string sql)
{
using (var conn = new SqlConnection(ConnectionString()))
{
var cmd = new SqlCommand(sql, conn);
conn.Open();
int result = (int)cmd.ExecuteScalar();
conn.Close();
return result;
}
}
#endregion
}
}
That's because the connection you have open is to the database you want to drop. 那是因为您打开的连接是您要删除的数据库。
You need to USE MASTER first. 你需要先使用MASTER。
See this article http://blog.sqlauthority.com/2007/12/07/sql-server-fix-error-3702-cannot-drop-database-because-it-is-currently-in-use/ 请参阅此文http://blog.sqlauthority.com/2007/12/07/sql-server-fix-error-3702-cannot-drop-database-because-it-is-currently-in-use/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.