我派生自这个基类,以便将每个单独的测试封装到一个回滚的事务中
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()
和内部交易它会外在,所以我不知道如何完成我想做的事
答案 0 :(得分:3)
您没有说出您使用的数据库。
在MS SQL Server中,如果你BEGIN TRANSACTION
在另一个事务中(使它们嵌套)然后在嵌套事务中ROLLBACK TRANSACTION
,它将回滚所有内容(整个外部事务)。
没有savepoint_name或transaction_name的ROLLBACK TRANSACTION 回滚到交易的开头。嵌套时 在事务中,同一语句将所有内部事务回滚到 最外面的BEGIN TRANSACTION语句。
为了能够仅回滚内部嵌套事务,它应该由SAVE TRANSACTION <name>
启动,并为嵌套事务指定一些名称。然后你可以ROLLBACK <name>
回滚嵌套部分。
如果您正在使用其他数据库,则嵌套事务中的行为可能会有所不同。
我不知道如何让你的类发出正确的BEGIN or SAVE TRANSACTION
SQL语句,具体取决于事务是否嵌套。