1

我正在编写集成测试来验证我的存储库中的行为。我遇到的问题是我想从一个干净的数据库开始为每个测试。我设法通过如下编写 SetUp 来做到这一点:

    [SetUp]
    public void SetUp()
    {
        _applicationContext = new TestApplicationContext();

        _applicationContext.Database.Connection.Close();
        _applicationContext.Database.Delete();
        _applicationContext.Database.Create();

        _tenantRepository = new TenantRepository(_applicationContext);
        _userRepository = new UserRepository(_applicationContext);
    }

TestApplicationContext数据库名称设置为TestDatabase.

这工作正常,直到我想检查我的测试结果的实际数据库。然后我从 MSSQL 服务器连接到同一个数据库,在我之前不会关闭:

  • 关闭 MSSQL 服务器
  • 使用“关闭所有连接”选项删除数据库

我发现的唯一方法是通过 SQL 命令。也许是因为我对 MSSQL 的 n00b 知识,但我有点希望有一个“关闭连接”按钮/选项。

如何关闭从 MSSQL 服务器到数据库的连接?或者,有没有办法可以从 C# 以编程方式执行此操作?

更新:

也许我不是很清楚。但是在我打开 MSSQL 并查看表的内容后,测试设置失败。这是因为 MSSQL 还创建了到 TestDatabase 的连接,而我的集成测试无法关闭连接。所以我正在寻找一种解决方案,允许我关闭从 MSSQL 服务器创建的连接。

4

3 回答 3

2

您将连接释放回连接池,而不是实际关闭它。不要为每个测试创建/删除数据库,而是在设置中开始新事务并在清理中回滚。这样,您的数据库将不会发生任何更改,并且您的测试将始终从干净的状态开始。

另外,因为您正在针对实时数据库进行测试,所以我不会将您的测试称为“单元”测试。单元测试没有任何外部依赖。

于 2013-01-20T18:52:53.487 回答
2

如果不是删除并重新创建整个数据库,而是删除并重新创建选定的(或所有表),则可以解决连接问题。

您可以创建一个小脚本,以一种不需要硬编码表名的方式为您执行此操作:http: //www.apexure.com/blog/2010/07/29/delete-all-tables-在-sql-server-数据库/

或者,Julia Lerman 在她的“Programming Entity Framework: Code First”一书中以更成熟的形式提到了这种方法,并作为自定义数据库初始化程序合并:

除了编写自己的自定义初始化程序外,您还可以找到其他人创建的初始化程序。EFCodeFirst.CreateTablesOnly NuGet 包中提供了一个示例。此初始化程序将允许您在现有数据库中删除和创建表,而不是删除和创建实际数据库本身。如果您的目标是您无权删除或创建整个数据库的托管数据库,这将特别有用。

于 2013-01-20T19:58:35.417 回答
0

可靠地获得数据库排他锁的唯一方法是使用该SINGLE_USER WITH ROLLBACK IMMEDIATE技术。我建议您创建一个空状态的数据库快照并每次都还原到该快照。那会快得多。

于 2013-01-20T20:23:57.740 回答