NUnit 回滚属性似乎在 SQL Server 2005 上失败

NUnit Rollback attribute seems to fail on SQL Server 2005

我在我的 NUnit 数据库级测试中使用了一个不错的小 [Rollback] 属性:

public class RollbackAttribute : Attribute, ITestAction 
{
   private TransactionScope _transaction;

   public ActionTargets Targets {
      get { return ActionTargets.Test; }
   }

   public void BeforeTest(TestDetails testDetails) {
      _transaction = new TransactionScope();
   }

   public void AfterTest(TestDetails testDetails) {
      _transaction.Dispose();
   }
}

所以我可以像这样装饰我的基于数据库的测试:

[Test]
[Rollback]
public void TestGetAllActiveItems()
{
    // Arrange
    SetupTestData();

    // Act
    var results = GetAllActiveItems(string.Empty, string.Empty);

    // Assert
    Assert.IsNotNull(results);
}

我在SetupTestData()方法中创建和存储的示例数据用于测试,然后在测试结束时丢弃。

这在我本地开发机器上的 SQL 服务器 2012 和 2014 上非常有效 - 但由于某种原因,它似乎在我们仍在使用 [=33] 的构建和测试机器上惨败=] Server 2005(即将升级)。

知道为什么吗?我只看到我在 SetupTestData() 方法中插入数据库的两个项目为每个测试方法插入一次,并且 NOT 在每个方法结束时回滚,出于某种奇怪的原因......我在构建/测试运行日志中没有看到任何错误或其他指示 - 它只是 工作并且没有在我的上进行回滚build/test 服务器。

有什么指点吗?想法?要检查的点?

基于描述 SQL2005 细节的 this article 我认为您的问题可能是您对所有事务重复使用相同的连接,引用:

In SQL Server 2005, using the TransactionScope starts a local, not a distributed, transaction. This is the behavior whether TransactionScope is used with client-side code or SQLCLR procedures unless there is already a transaction started when the SQLCLR procedure is invoked.

...

The transaction actually begins when Open is called on the SqlConnection, not when the TransactionScope instance is created.

...

At this point, because SQL Server 2005 doesn’t support autonomous transactions on the same connection, SqlConnection’s BeginTransaction method is the best choice for local transactions.

请告诉我这条信息是否有效,因为我目前无法自行测试问题。