为什么使用TransactionScope和MSDTC的VS数据库单元测试失败?

时间:2009-05-13 10:01:28

标签: .net unit-testing exception-handling msdtc

我们使用DatabaseTestFixture类对SQL Server 2000数据库运行一些单元测试,该类使用未提交的TransactionScope,因此会回滚所有更改。测试针对本地数据库运行没有问题。

然后,我们将单元测试指向一个公共数据库服务器,并在运行单元测试的机器上设置MSDTC,并且一切都很好。

现在我们已经设置了一台新机器,它也将针对相同的公共数据库运行单元测试。单元测试不在此机器上运行,我们收到以下错误:

  

System.Transactions.TransactionException:事务已被隐式或显式提交或中止。

MSDTC设置与正在运行的设置完全相同,我们逐屏比较。

之前有没有人经历过这样的事情?或者对我们可能在哪里找到可能导致它的原因的线索有任何指示?

我们已检查过Windows版本和服务包,防火墙选项,msdtc选项,VS版本和服务包。

2 个答案:

答案 0 :(得分:3)

这似乎与NUnit 2.5有关。 在此之前,以下代码运行良好:

[SetUp]
public void SetUp() {
    this._testDataContext = new DataContext();
    this._transactionScope = new TransactionScope();
}

[TearDown]
public void TearDown() {
    if (_transactionScope != null)
    {
        this._transactionScope.Dispose();
    }
    if (_testDataContext != null)
    {
        _testDataContext.Dispose();
    }
}

使用2.5时,事务范围需要与TransactionScopeOption.RequiresNew实例化。我假设它没有正确处理,或者NUnit在运行测试时运行了一些环境事务。 将SetUp方法的第二行更改为

this._transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew);

它应该可以正常工作。

如果有人设法更好地解释为什么会发生这种情况,我很乐意听到。

答案 1 :(得分:1)

此问题可能与您正在使用的Nunit版本有关。运行2.5单元时我遇到了完全相同的问题但是当我用nunit 2.4.8或2.2运行单元测试时,问题神秘地消失了。

请试试这个让我知道所以我提高了我的微不足道的个人资料!

此致

MAC