【问题标题】:Why are my TransactionScopes not being respected during testing?为什么我的 TransactionScopes 在测试期间没有得到尊重?
【发布时间】:2014-08-27 16:23:17
【问题描述】:

鉴于以下情况:

public class TestEnvironment
{

  private static TransactionScope scope;

  [AssemblyInitialize]
  public static void Init(TestContext context) 
  {

    /* establish database connection, create Session fake, create Items fake, etc. */

    scope = new TransactionScope();

  }

  [AssemblyCleanup]
  public static void Cleanup()
  {
    scope.Dispose();
  }
}

我看到数据库中出现了测试数据。我在测试输出中看到以下错误:

必须在创建的同一线程中处理 TransactionScope 它。

这仅在运行所有测试时发生。当任何给定的测试单独运行时,都没有问题。

如果我删除 scope.Dispose() 调用,允许“自然”处置范围,错误就会消失,但我仍然看到记录在数据库中累积。

【问题讨论】:

    标签: c# transactions integration-testing transactionscope


    【解决方案1】:

    没有过多谈论TransactionScope如何与线程一起工作(因为我对此事一无所知),通过在每个TestClass的实例化期间创建范围来解决问题。

    为了节省少量击键,我们创建了一个ScopedTestClass 类:

    public class ScopedTestClass : IDisposable
    {
      private TransactionScope TxnScope;
      public ScopedTestClass()
      {
        TxnScope = new TransactionScope();
      }
      public void Dispose()
      {
        TsnScope.Dispose();
      }
    }
    

    每个TestClass 都继承自:

    [TestClass]
    public class MyTestClass : ScopedTestClass
    {
      [TestMethod]
      public void DoSomething()
      {
        // sanity at last!
      }
    }
    

    一切都很好。

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 2020-04-24
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多