为NUnit testfixture和SetUp嵌套TransactionScope

本文关键字:嵌套 TransactionScope SetUp NUnit testfixture | 更新日期: 2023-09-27 18:10:29

我从这个基类派生,以便将每个单独的测试包含到回滚的事务中

public abstract class TransactionBackedTest
{
    private TransactionScope _transactionScope;
    [SetUp]
    public void TransactionSetUp()
    {
        var transactionOptions = new TransactionOptions
        {
            IsolationLevel = IsolationLevel.ReadCommitted,
            Timeout = TransactionManager.MaximumTimeout
        };
        _transactionScope = new TransactionScope(TransactionScopeOption.Required, 
                                                 transactionOptions);
    }
    [TearDown]
    public void TransactionTearDown()
    {
        _transactionScope.Dispose();
    }
}

我也尝试用同样的方式设置一个TestFixure事务:

[TestFixture]
class Example: TransactionBackedTest
{
    private TransactionScope _transactionScopeFixure;

    [TestFixtureSetUp]
    public void Init()
    {
        var transactionOptions = new TransactionOptions
        {
            IsolationLevel = IsolationLevel.ReadCommitted,
            Timeout = TransactionManager.MaximumTimeout
        };
        _transactionScopeFixure = new TransactionScope(TransactionScopeOption.Required,
                                                       transactionOptions);

        SetupAllDataForAllTest();
    }
    [TestFixtureTearDown]
    public void FixtureTearDown()
    {
        _transactionScopeFixure.Dispose();
    }

    public void SetupAllDataForAllTest()
    {
        // Sql stuff here that will get undone from the TestFixtureTearDown scope dispose
    }

    [Test]
    public void DoSqlStuff1()
    {
        // Sql stuff here that will get undone from the TransactionBackedTest
    }
    [Test]
    public void DoSqlStuff2()
    {
        // Sql stuff here that will get undone from the TransactionBackedTest
    }
}

的想法是,SetupAllDataForAllTest在开始时运行一次,并插入测试所依赖的所有基本数据。一旦测试完成,需要删除/回滚此基本数据。

我还希望每个测试都是隔离的,这样它们就不会相互干扰。

我现在遇到的问题是,在第一次测试之后,它声明TestFixture事务已经关闭,即使我只希望它关闭SetUp事务。我的假设是,如果你Dispose()和内部事务,它处置外部,所以我不确定如何完成我想做的

为NUnit testfixture和SetUp嵌套TransactionScope

你没有说你使用什么数据库。

在MS SQL Server中,如果您在另一个事务中BEGIN TRANSACTION(使它们嵌套),然后在嵌套事务中ROLLBACK TRANSACTION,它将回滚一切(整个外部事务)。

回滚事务,没有savepoint_name或transaction_name回滚到事务的开始。当嵌套事务,该语句将所有内部事务回滚到最外层的BEGIN TRANSACTION语句

为了能够只回滚内部嵌套事务,它应该由SAVE TRANSACTION <name>启动,并为嵌套事务指定名称。然后可以使用ROLLBACK <name>回滚嵌套部分。

如果您正在使用其他数据库,它可能在嵌套事务中表现不同。

我不知道如何使你的类问题正确的BEGIN or SAVE TRANSACTION SQL语句取决于是否事务嵌套或不