有兩種方法可以做到這一點。 One對測試類中的方法使用TestInitialize和TestCleanup屬性。他們將分別在測試前後分別運行。
另一種方法是使用事實,即測試失敗通過異常傳播到測試運行器。這意味着您的測試中的try {} finally {}塊可以在斷言失敗後用於清理任何事情。
[TestMethod]
public void FooTest()
{
try
{
// setup some database objects
Foo foo = new Foo();
Bar bar = new Bar(foo);
Assert.Fail();
}
finally
{
// remove database objects.
}
}
嘗試/最後清理可以變得非常混亂是有很多的對象來清理。我的團隊傾向於實施IDisposable的助手類。它跟蹤已創建的對象並將它們推入堆棧。當調用Dispose時,項目從堆棧彈出並從數據庫中移除。
[TestMethod]
public void FooTest()
{
using (FooBarDatabaseContext context = new FooBarDatabaseContext())
{
// setup some db objects.
Foo foo = context.NewFoo();
Bar bar = context.NewBar(foo);
Assert.Fail();
} // calls dispose. deletes bar, then foo.
}
這有附加的好處,就是在方法調用中包裝構造函數。如果構造函數簽名更改,我們可以輕鬆修改測試代碼。
您還應該使用'TearDown'(或其套件中的等價物)進行清理,因爲如果測試失敗,清理代碼將無法執行。 – 2012-03-26 00:39:45
如何捕捉異常,然後在清理後重新拋出異常? – 2012-03-26 06:59:32
Jimmy Bogard(* AutoMapper *的作者)有一篇很棒的文章和工具:[Respawn的可靠數據庫測試](https://lostechies.com/jimmybogard/2015/02/19/reliable-database-tests-with-respawn /) – 2016-06-14 10:32:41