我们使用DatabaseTestFixture类对SQL Server 2000数据库运行一些单元测试,该类使用未提交的TransactionScope,因此会回滚所有更改。测试针对本地数据库运行没有问题。
然后,我们将单元测试指向一个公共数据库服务器,并在运行单元测试的机器上设置MSDTC,并且一切都很好。
现在我们已经设置了一台新机器,它也将针对相同的公共数据库运行单元测试。单元测试不在此机器上运行,我们收到以下错误:
System.Transactions.TransactionException:事务已被隐式或显式提交或中止。
MSDTC设置与正在运行的设置完全相同,我们逐屏比较。
之前有没有人经历过这样的事情?或者对我们可能在哪里找到可能导致它的原因的线索有任何指示?
我们已检查过Windows版本和服务包,防火墙选项,msdtc选项,VS版本和服务包。
答案 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