Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NUnit TestFixure和SetUp的嵌套TransactionScope_C#_Sql_Unit Testing_Transactions_Nunit - Fatal编程技术网

C# NUnit TestFixure和SetUp的嵌套TransactionScope

C# NUnit TestFixure和SetUp的嵌套TransactionScope,c#,sql,unit-testing,transactions,nunit,C#,Sql,Unit Testing,Transactions,Nunit,我从这个基类派生,以便将每个独立测试封装到回滚的事务中 public abstract class TransactionBackedTest { private TransactionScope _transactionScope; [SetUp] public void TransactionSetUp() { var transactionOptions = new TransactionOptions {

我从这个基类派生,以便将每个独立测试封装到回滚的事务中

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事务已经关闭,尽管我只希望它关闭设置事务。我的假设是,如果您
Dispose()
和内部事务,它会占用外部事务,因此我不确定如何完成我想做的事情

您没有说您使用的是什么数据库

在MS SQL Server中,如果您在另一个事务内部(使其嵌套),然后在嵌套事务内部,它将回滚所有事务(以及整个外部事务)

回滚没有保存点名称或事务名称的事务 回滚到事务的开头。筑巢时 事务,该语句将所有内部事务回滚到 最外层的BEGIN事务语句

为了能够仅回滚内部嵌套事务,应该使用嵌套事务的某个名称启动它。然后您可以
ROLLBACK
仅回滚嵌套零件

如果您使用的是其他数据库,它在嵌套事务中的行为可能会有所不同


我不知道如何使类根据事务是否嵌套而发出正确的
开始或保存事务
SQL语句。

出于好奇,为什么要将测试放在事务范围内并回滚?您是否正在测试一些数据库调用,但不希望提交数据?我正在测试作为进程一部分进行合并的调用,但我不希望提交合并。整个测试有自己的事务,因为测试数据是预加载的。因此,在事务1中,插入测试数据,然后对于每个测试,可能会发生不应该提交的合并(测试数据应该被还原)。这是非常正确的:)我多年来一直相信我可以用MS-SQL嵌套事务。我错了。