我认为为NUnit测试装置创建基类会很好,这会在SetUp阶段打开TransactionScope,然后在拆卸过程中回滚事务。 像这样:
public abstract class TestFixtureBase
{
private TransactionScope _transaction;
[TestFixtureSetUp]
public void TestFixtureSetup()
{
_transaction = new TransactionScope();
}
[TestFixtureTearDown]
public void TestFixtureTearDown()
{
if (_transaction != null)
{
_transaction.Dispose();
}
}
}
你认为这是一个好主意吗?
显然,数据库只是一个测试数据库,而不是一个实时数据库,但如果它充满了单元测试中的垃圾数据,它仍然会很烦人。
其他人在运行涉及大量数据访问的单元测试时会做些什么?
答案 0 :(得分:4)
你想在这里小心。如果您打开多个与数据库的连接,TransactionScope将把事务提升为分布式事务。我发现在开始运行测试之前,编写一些简单的SQL会更容易清除我的测试类感兴趣的表。
编辑:通常我会调用任何触及数据库的测试集成测试,因为它涉及另一个系统。通常,我会在单元测试代码时模拟出数据库。
[TestSetup]
public void Setup()
{
foreach (string table in new string[] { "table1", "table2" })
{
ClearTable( table );
}
}
private void ClearTable( string table )
{
...standard stuff to set up connection...
SqlCommand command = connection.CreateCommand() );
command.CommandText = "delete from " + table;
command.ExecuteNonQuery();
... stuff to clean up connection...
}
答案 1 :(得分:1)
我用XtUnit 它会在单元测试结束时自动回滚。您只需在测试中添加[Rollback]属性即可。它是NUnit或MbUnit的扩展