2014-08-27 56 views
2

考慮以下幾點:爲什麼我的TransactionScopes在測試期間沒有得到尊重?

public class TestEnvironment 
{ 

    private static TransactionScope scope; 

    [AssemblyInitialize] 
    public static void Init(TestContext context) 
    { 

    /* establish database connection, create Session fake, create Items fake, etc. */ 

    scope = new TransactionScope(); 

    } 

    [AssemblyCleanup] 
    public static void Cleanup() 
    { 
    scope.Dispose(); 
    } 
} 

我看到的測試數據庫中的數據顯示。我在測試輸出中看到以下錯誤:

TransactionScope必須放置在創建 的同一線程中。

僅當運行所有測試時纔會發生這種情況。當任何給定的測試單獨運行時,沒有問題。

如果我刪除scope.Dispose()調用,允許範圍「自然」處置,錯誤消失,但我仍然看到記錄在數據庫中累積。

回答

2

沒有多說話TransactionScope如何與線程一起工作(因爲我對這個問題一無所知),通過在每個TestClass的實例化過程中創建示波器,問題得到解決。

爲了節省按鍵屈指可數,我們創建了一個ScopedTestClass類:

public class ScopedTestClass : IDisposable 
{ 
    private TransactionScope TxnScope; 
    public ScopedTestClass() 
    { 
    TxnScope = new TransactionScope(); 
    } 
    public void Dispose() 
    { 
    TsnScope.Dispose(); 
    } 
} 

,並從每個TestClass繼承:

[TestClass] 
public class MyTestClass : ScopedTestClass 
{ 
    [TestMethod] 
    public void DoSomething() 
    { 
    // sanity at last! 
    } 
} 

而且一切都很好。

相關問題