6

在我關於EF4回滾交易的研究中,似乎每個人都提到this blog post或提供了類似的解釋。在我的場景中,我想在單元測試場景中執行此操作,我想在單元測試環境中回滾幾乎所有事情,以防止更新數據庫中的數據(是的,我們將增加計數器,但那沒關係)。爲了做到這一點,最好遵循以下計劃嗎?我是否錯過了一些概念或其他重要的東西(除了我的SetupMyTestPerformMyTest函數不會真的以這種方式存在)?如何在EF4中回滾單元測試TearDown?

[TestMethod] 
public void Foo 
{ 
    using (var ts = new TransactionScope()) 
    { 
    // Arrange 
    SetupMyTest(context); 

    // Act 
    PerformMyTest(context); 
    var numberOfChanges = context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 
    // if there's an issue, chances are that an exception has been thrown by now. 

    // Assert 
    Assert.IsTrue(numberOfChanges > 0, "Failed to _____"); 

    // transaction will rollback because we do not ever call Complete on it 
    } 
} 
+0

嗯,在EF4中,顯然SaveChanges(false)過載已被棄用。它看起來像SaveChanges(SaveOptions.AcceptAllChangesAfterSave)是它的替代品,所以我在我原來的問題進行更新。 – Jaxidian 2010-04-21 21:01:55

回答

10

我們爲此使用了TransactionScope。

private TransactionScope transScope; 

    #region Additional test attributes 
    // 
    // Use TestInitialize to run code before running each test 
    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     transScope = new TransactionScope(); 
    } 

    // Use TestCleanup to run code after each test has run 
    [TestCleanup()] 
    public void MyTestCleanup() 
    { 
     transScope.Dispose(); 
    } 

這將回滾任何測試中所做的任何更改。

+0

您在編寫/調試測試時是否存在掛起事務的問題?我更喜歡對共享數據庫這樣做,但我不想以這種方式來處理我們不斷處理掛起的事務。 – Jaxidian 2010-04-21 21:04:08

+0

如果您不進行處置,您將掛起交易。如果沒有配置,交易將掛起直到超時。 – 2010-04-21 21:08:33

+0

有沒有機會更新您的代碼示例以顯示基本測試的樣子? 'SaveChanges(SaveOptions.AcceptAllChangesAfterSave)'是否是正確的方法來解決這個問題? – Jaxidian 2010-04-21 21:11:47