2

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

你认为这是个好主意吗?

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

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

4

2 回答 2

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...
}
于 2008-12-02T04:19:57.017 回答
1

我用过XtUnit 它会在单元测试结束时自动回滚。您可以简单地将 [Rollback] 属性添加到测试中。它是 NUnit 或 MbUnit 的扩展

于 2008-12-09T19:04:49.767 回答