为什么我的TransactionScopes在测试期间没有得到尊重?

时间:2014-08-27 16:23:17

标签: c# transactions integration-testing transactionscope

鉴于以下内容:

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()调用,允许范围“自然”处理,则错误消失,但我仍然看到记录在数据库中累积。

1 个答案:

答案 0 :(得分:2)

如果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!
  }
}

一切都很好。