这样安全吗? - NUnit基类打开并回滚TransactionScope

时间:2008-12-02 04:12:23

标签: nunit transactionscope

我认为为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();
        }
    }
}

你认为这是一个好主意吗?

显然,数据库只是一个测试数据库,而不是一个实时数据库,但如果它充满了单元测试中的垃圾数据,它仍然会很烦人。

其他人在运行涉及大量数据访问的单元测试时会做些什么?

2 个答案:

答案 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的扩展