【问题标题】:NUnit Rollback attribute seems to fail on SQL Server 2005NUnit 回滚属性似乎在 SQL Server 2005 上失败
【发布时间】:2015-04-13 16:29:22
【问题描述】:

我在我的 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 Server 2012 和 2014 上就像一个魅力 - 但由于某种原因,它似乎在我们仍在使用 SQL Server 2005(即将升级)的构建和测试机器上惨遭失败.

任何想法为什么?我只是看到我在SetupTestData() 方法中插入数据库的两个项目为每个测试方法插入一次,并且 NOT 在每个方法的末尾回滚,原因很奇怪。 ...我在构建/测试运行日志中没有看到任何错误或其他指标 - 它只是不起作用并且不会在我的构建/测试服务器上进行回滚。

有什么建议吗?想法?检查点?

【问题讨论】:

  • 你能解决这个问题吗?
  • @MichalHosala:不,仍在努力。它似乎与(a)在测试开始之前打开的 SQL 连接,以及(b)EF 的多个 ObjectContexts 导致“MSDTC”在服务器上启动(并失败) - 很奇怪...... .. 但我也确认这是一个普遍问题 - SQL Server 2014(在构建服务器上)也有同样的问题 - 它不是特定于版本的

标签: sql-server-2005 nunit rollback


【解决方案1】:

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

在 SQL Server 2005 中,使用 TransactionScope 启动本地事务,而不是分布式事务。这就是 TransactionScope 与客户端代码或 SQLCLR 过程一起使用时的行为,除非在调用 SQLCLR 过程时已经启动了事务。

...

事务实际上在 SqlConnection 上调用 Open 时开始,而不是在创建 TransactionScope 实例时开始。

...

此时,由于 SQL Server 2005 不支持同一连接上的自治事务,SqlConnection 的 BeginTransaction 方法是本地事务的最佳选择。

请让我知道这条信息是否有效,因为我目前无法自己测试问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多