我(和许多其他人一样)遇到了这样的问题:我无法让我的 NUnit 测试删除数据库中的数据库[SetUp]
我的测试装置。
我想要实现什么
我想编写集成测试来测试我的代码并验证预期结果是否存储在数据库中(断言 CRUD 方法)。那,and我希望能够实际显示 Sql Server 中的表并查看数据库中的结果如何。最后一部分似乎很难实现......
出了什么问题
我可以连续多次运行测试。数据库在中重新创建[SetUp]
每次测试都通过断言。当我想在 SqlServer 的实际数据库中检查结果时,它就付诸东流了。一旦我从 SqlServer 打开连接,[SetUp]
方法不允许删除数据库,因为它具有打开的连接。
我尝试过什么
- 数据库初始化程序
- 更改数据库设置 SINGLE_USER 并立即回滚
- Pooling=false 添加到连接字符串
我的这些想法来自this https://stackoverflow.com/questions/5494158/entity-framework-4-1-code-first-setinitializer-not-being-called-again-after-da and this https://stackoverflow.com/questions/5288996/database-in-use-error-with-entity-framework-4-code-first/5289296#5289296所以帖子。
我有什么
The [SetUp]
method:
[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");
}
The [TearDown]
method:
[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) 或者我被允许查看Sql Server中的表,然后我不再被允许从我的数据库中删除数据库[SetUp]
固定装置。
无法删除数据库“TestTenantDatabase”,因为它当前正在使用。
关闭 Sql Server 是我知道摆脱这个问题的唯一方法。但后来我发现自己重新启动了 Sql Servera lot白天...(关闭数据库连接的选项也会有所帮助,但我找不到它)。
有人可以指导我完成这个吗?