2

我(像许多其他人一样)遇到了我无法让我的 NUnit 测试删除[SetUp]我的测试夹具中的数据库的问题。

我想要达到的目标

我想编写集成测试来测试我的代码并验证预期结果是否存储在数据库中(断言 CRUD 方法)。那,希望能够实际显示 SqlServer 中的表并查看数据库中的结果如何。最后一部分似乎很难实现......

出了什么问题

我可以连续多次运行我的测试。[SetUp]每次都重新创建数据库,并且测试通过了断言。一旦我想在 SqlServer 的实际数据库中检查我的结果,它就会付诸东流。一旦我从 SqlServer 打开连接,该[SetUp]方法就不允许删除数据库,因为它有打开的连接。

我试过什么

  • 数据库初始化器
  • ALTER 数据库 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  • Pooling=false 添加到连接字符串

我从这个这个SO 帖子中获得了这些想法。

我有什么

[SetUp]方法:

    [SetUp]
    public void SetUp()
    {
        // TenantSeedInitializer extends the 
        // DropCreateDatabaseAlways<TenantApplicationTestContext> class

        Database.SetInitializer(new TenantSeedInitializer());
        _applicationContext = new TenantApplicationTestContext();
        _applicationContext.Database.ExecuteSqlCommand("ALTER DATABASE " + 
            TenantApplicationTestContext.DatabaseName + 
            " SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
    }

[TearDown]方法:

    [TearDown]
    public void TearDown()
    {
        SqlConnection.ClearAllPools();
    }

还有一个非常直接的测试:

    [Test]
    public void AddTenant()
    {
        // add a new tenant to the database and verify that there
        // there is only one tenant present in the table  
    }

正如我所说,连续多次运行这个测试就像一个魅力,直到我尝试在 SqlServer 中打开表。

两种不同的(对我来说未解决的)错误场景

1)要么我不允许查看表格,因为来自 Visual Studio 的连接仍然打开。

数据库“TestTenantDatabase”已经打开,一次只能有一个用户。

添加SqlConnection.ClearAllPools();似乎并不能解决这个问题。

2)或者我被允许在 SqlServer 中查看表,然后我不再被允许从我的[SetUp]夹具中删除数据库。

无法删除数据库“TestTenantDatabase”,因为它当前正在使用中。

关闭 SqlServer 是我知道摆脱这种情况的唯一方法。但是后来我发现自己在白天经常重启 SqlServer ......(关闭与数据库的连接的选项也会有所帮助,但我找不到它)。

任何人都可以指导我完成这个吗?

4

1 回答 1

0

这条信息:

数据库“TestTenantDatabase”已经打开,一次只能有一个用户。

正在发生,因为您已将数据库设置为单用户。通常,您会这样做会杀死与数据库的其他连接,并使您的连接成为唯一可以访问它的连接。但是,如果您更改数据库上下文,则其他应用程序可能会连接进来,例如 Visual Studio,并成为单个用户,从而有效地将您锁定在外。

在您的设置夹具中尝试此操作:

use TestTenantDatabase;
alter database TestTenantDatabase set single_user with rollback immediate;
use master;
drop database TestTenantDatabase;

如果你在设置单用户时在数据库中,你将成为单用户。然后,如果您更改为 master 然后在同一批次中删除数据库,它应该会击败任何试图连接到它的人。

另一种选择是设置离线,而不是 single_user,但是,当您删除数据库时,它不会删除数据库 .mdf 和 .ldf(以及任何 .ndf)文件,因此您可能会遇到为另一个重新创建数据库的问题一组测试。

如果在运行 single_user 时遇到与死锁相关的错误,请将死锁优先级设​​置为高。如果要重用连接,可以在删除后将其设置为正常。

于 2013-02-24T11:36:51.540 回答