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

这安全吗NUnit基类打开并回滚TransactionScope,nunit,transactionscope,Nunit,Transactionscope,我想最好为NUnit测试装置创建一个基类,在设置阶段打开TransactionScope,然后在拆卸阶段回滚事务。 大概是这样的: public abstract class TestFixtureBase { private TransactionScope _transaction; [TestFixtureSetUp] public void TestFixtureSetup() { _transaction = new Trans

我想最好为NUnit测试装置创建一个基类,在设置阶段打开TransactionScope,然后在拆卸阶段回滚事务。 大概是这样的:

    public abstract class TestFixtureBase
{
    private TransactionScope _transaction;

    [TestFixtureSetUp]
    public void TestFixtureSetup()
    {
        _transaction = new TransactionScope();
    }

    [TestFixtureTearDown]
    public void TestFixtureTearDown()
    {
        if (_transaction != null)
        {
            _transaction.Dispose();
        }
    }
}
你认为这是个好主意吗

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


当运行涉及大量数据访问的单元测试时,其他人会怎么做?

在这里您需要小心。如果打开多个数据库连接,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...
}
我用过
它在单元测试结束时自动回滚。您可以简单地向测试添加[Rollback]属性。它是NUnit或MbUnit的扩展,用于模拟数据访问。。。除非您实际正在测试DAL实现。