2012-08-15 56 views
4

我在测试我的Nhibernate存储库时遇到一个奇怪的问题。为什么使用mstest进行单元测试时MSDTC行为不一致?

我有10个像下面的单元测试。每次运行他们在一批中第一次失败,其余成功。如果一个接一个地运行它们都会失败。如果在我的testrun之前重新启动MSDTC,它有时会像以前一样运行,有时候所有的测试都会成功。我无法找到一个模式,为什么它的行为如此。

我希望事务回滚,以便每个测试都有一个干净的数据库,因此交易处置。

测试/测试失败了,由于这个错误:

System.Data.SqlClient.SqlException: MSDTC on server 'MYCOMPUTERNAME\SQLEXPRESS' is unavailable.

我的测试是这样的:

[TestInitialize] 
public void MyTestInitialize() 
{ 
    _transactionScope = new TransactionScope(); 
} 

[TestCleanup] 
public void MyTestCleanup() 
{ 
    if (_transactionScope != null) 
    {     
     _transactionScope.Dispose(); 
     _transactionScope = null; 
    } 
}    

[TestMethod] 
[TestCategory("RepositoryTests")] 
public void RepositoryCanSaveAProduct() 
{ 
    var platform = ProductObjectMother.CreatePlatform("100010", "Supplier 10"); 

    var mainsegment = ProductObjectMother.CreateMainSegment("123"); 
    var application = ProductObjectMother.CreateApplication("Foo"); 
    var productfamily = ProductObjectMother.CreateProductFamily("X99"); 

    Engine i = ProductObjectMother.CreateEngine(platform, productfamily, application, mainsegment); 
    var repository = new ProductRepository(); 
    repository.Save(i); 
    repository.Flush(); 
} 
+0

我建议你从简单的控制台应用程序运行相同的代码,并检查是否得到相同的错误。我认为'MSTest'在这里不是问题。另外你的代码没有使用'_transactionScope'运行,并且你不会在任何地方回滚它。 – Schaliasos 2013-01-22 17:32:27

+0

您的代码在单线程或业务逻辑中运行时是否会产生一些新线程? – 2013-01-28 19:25:59

+0

在Dispose()之前添加'_transactionScope.Rollback()'怎么办? – 2013-01-29 13:21:42

回答

2

问题似乎是与交易既不使用_transactionScope.Complete(承诺)或通过抛出异常回滚。

另外我注意到一件奇怪的事情,测试通常会失败或者通过测试中缺少的“断言”函数(等于,不等于,存在于声明中)成功运行。 :)