我(像许多其他人一样)遇到了我无法让我的 NUnit 测试删除[SetUp]
我的测试夹具中的数据库的问题。
我想要达到的目标
我想编写集成测试来测试我的代码并验证预期结果是否存储在数据库中(断言 CRUD 方法)。那,我希望能够实际显示 SqlServer 中的表并查看数据库中的结果如何。最后一部分似乎很难实现......
出了什么问题
我可以连续多次运行我的测试。[SetUp]
每次都重新创建数据库,并且测试通过了断言。一旦我想在 SqlServer 的实际数据库中检查我的结果,它就会付诸东流。一旦我从 SqlServer 打开连接,该[SetUp]
方法就不允许删除数据库,因为它有打开的连接。
我试过什么
- 数据库初始化器
- ALTER 数据库 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
- Pooling=false 添加到连接字符串
我有什么
[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 ......(关闭与数据库的连接的选项也会有所帮助,但我找不到它)。
任何人都可以指导我完成这个吗?