1

我正在使用VS 2015单元测试来测试SQL Server 2012数据库。我希望能够使用预测试来插入测试数据,并将整个单元测试包装在可以在测试结束时回滚的事务中。我试过在TransactionScope(下面)中包装整个测试代码,但它不回滚插入。在事务中包装Visual Studio数据库单元测试以消除数据库更改持久

  using (TransactionScope scope = new TransactionScope()) 
     { 
      SqlDatabaseTestActions testActions = this.dbo_Proc1TestData; 
      // Execute the pre-test script 
      // 
      System.Diagnostics.Trace.WriteLineIf((testActions.PretestAction != null), "Executing pre-test script..."); 
      SqlExecutionResult[] pretestResults = TestService.Execute(this.PrivilegedContext, this.PrivilegedContext, testActions.PretestAction); 
      try 
      { 
       // Execute the test script 
       // 
       System.Diagnostics.Trace.WriteLineIf((testActions.TestAction != null), "Executing test script..."); 
       SqlExecutionResult[] testResults = TestService.Execute(this.ExecutionContext, this.PrivilegedContext, testActions.TestAction); 
      } 
      finally 
      { 
       // Execute the post-test script 
       // 
       System.Diagnostics.Trace.WriteLineIf((testActions.PosttestAction != null), "Executing post-test script..."); 
       SqlExecutionResult[] posttestResults = TestService.Execute(this.PrivilegedContext, this.PrivilegedContext, testActions.PosttestAction); 
      } 
     } 

是否有任何其他的方法来做到这一点,而不诉诸于测试后删除数据?

+0

我找到了答案在https://msdn.microsoft.com/en-us/library/aa833153.aspx – runamuk0

回答

1

事实证明,ExecutionContext和PrivilegedContext已经被创建,因此不会在TransactionScope创建的事务中登记。解决方法是调用添加到EnlistTransaction为每个上下文using语句中:

 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
     { 
      this.ExecutionContext.Connection.EnlistTransaction(Transaction.Current); 
      this.PrivilegedContext.Connection.EnlistTransaction(Transaction.Current);