c# - 使用 LocalDB 进行集成测试

标签 c# testing nunit integration-testing localdb

为了针对我的应用程序的一些数据访问代码编写集成测试,我编写了一个抽象类用于数据库集成测试

它使用 LocalDB 创建一个新的数据库实例,然后在完成后将其删除。

但是由于某些原因,DROP DATABASE 命令总是失败并出现以下异常:

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

这是为什么?使用 LocalDB 进行集成数据库测试是否有更好的方法?

下面是我的抽象数据库集成测试类的代码:

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
    }
}

最佳答案

那是因为您打开的连接是指向您要删除的数据库的。

您需要先使用 MASTER。

查看本文 http://blog.sqlauthority.com/2007/12/07/sql-server-fix-error-3702-cannot-drop-database-because-it-is-currently-in-use/

关于c# - 使用 LocalDB 进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22402778/

相关文章:

c# - 如何删除 List<int[]> 中的所有第一项

javascript - C# 和 Javascript - 如何将删除对象添加到 Javascript 数组并回发到服务器?

java - 如何让 Eclipse 忽略测试源目录

build - CAKE build 和 NUNIT3 生成空结果文件

c# - Rhino Mocks 不抛出异常

c# datagridview - 获得高级粘贴功能

c# - C# 泛型有性能优势吗?

git - 我应该如何在 Git 中管理测试工具——它们应该在一个单独的仓库中吗?

unit-testing - 哪些测试场景对于详尽黑盒测试定期预约模型是必要且充分的?

.net - 如何在不耗尽所有系统内存的情况下使 .NET 进程耗尽内存