2

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

然后,我们将单元测试指向一个通用数据库服务器,并在运行单元测试的机器上设置 MSDTC,这台机器一切正常。

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

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

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

有没有人经历过这样的事情?或者得到任何关于我们可以在哪里寻找可能导致它的线索的指示?

我们检查了 Windows 版本和服务包、防火墙选项、msdtc 选项、VS 版本和服务包。

4

2 回答 2

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);

它应该可以正常工作。

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

于 2009-06-25T19:15:25.873 回答
1

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

请尝试这个让我知道,这样我就可以提高我微不足道的个人资料积分!

问候

苹果电脑

于 2009-05-18T15:01:07.307 回答