gpt4 book ai didi

c# - NUnit TestFixure 和 SetUp 的嵌套 TransactionScope

转载 作者:太空狗 更新时间:2023-10-29 20:33:27 26 4
gpt4 key购买 nike

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

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() 和内部事务,它会处理外部事务,所以我不确定如何完成我想做的事情

最佳答案

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

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

ROLLBACK TRANSACTION without a savepoint_name or transaction_name rolls back to the beginning of the transaction. When nesting transactions, this same statement rolls back all inner transactions to the outermost BEGIN TRANSACTION statement.

为了能够只回滚内部嵌套事务,它应该由 SAVE TRANSACTION <name> 启动。为嵌套事务命名。然后你可以ROLLBACK <name>仅回滚嵌套部分。

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

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

关于c# - NUnit TestFixure 和 SetUp 的嵌套 TransactionScope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32315194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com