2010-07-28 60 views
1

我正在爲我的數據庫編寫集成測試,並且我有一個問題。在測試方法開始時,我將一些對象添加到數據庫,並在方法結束時將其刪除。在NUnit中捕獲斷言失敗的正確方法

所以我有一個像代碼:

var group = new ContactGroup { Name = UserLogin + "_test_group" }; 
group.ID = _provider.AddGroup(UserLogin, group); 
Assert.That(_provider.GetGroup(UserLogin, group.ID), Is.Not.Null); 
_provider.RemoveGroup(UserLogin, group.ID); 

的一點是,如果斷言失敗,RemoveGroup將不會被執行。我能做些什麼呢?

如果我試試這個:

var group = new ContactGroup { Name = UserLogin + "_test_group" }; 
group.ID = _provider.AddGroup(UserLogin, group); 
try 
{ 
    Assert.That(_provider.GetGroup(UserLogin, group.ID), Is.Not.Null); 
} 
finally 
{ 
    _provider.RemoveGroup(UserLogin, group.ID); 
} 

我應該重新拋出AssertionException這樣

catch (AssertionException) 
{ 
    throw; 
} 

回答

4

一個來處理數據庫集成測試清理的辦法是在一個事務中,然後回滾一旦測試完成後,執行測試。

+0

該死的,這很容易:)謝謝! – HiveHicks 2010-07-28 13:27:53

1

使用拆卸方法。拆卸方法在每次測試後立即執行。

[TearDown] 
    public void TearDown() 
    { 
     _provider.RemoveGroup(UserLogin, group.ID); 
    } 
+0

+1此外還有一個拆卸類裝置,另一個拆卸命名空間。 – 2010-07-28 13:25:55

+0

我只在選定的方法中創建此組。有沒有其他的方法可以解決這個問題,因爲我不想在每次測試前都不需要創建組? – HiveHicks 2010-07-28 13:26:11

0

DBUnit人建議在啓動而不是關機時破壞(Good setup don't need cleanup!),這就是我所做的。因此,測試的開始將刪除測試不期望的任何數據。

0

根本不需要catch條款。在C#中,try {... throw ...} finally {...}將執行finally子句,然後將堆棧中的異常發送到最近的catch,如果沒有,則將其排到程序的頂部。因此

try { 
    Assert.Fail("BOOM!"); 
} finally { 
    Cleanup(); 
} 

會做你想要什麼:運行Cleanup(),然後從斷言死亡。