2012-08-15 55 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(承諾)或通過拋出異常回滾。

另外我注意到一件奇怪的事情,測試通常會失敗或者通過測試中缺少的「斷言」函數(等於,不等於,存在於聲明中)成功運行。 :)