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嵌套事务。我错了。