2010-05-09 116 views
0

我正在運行一些需要連接到數據庫的單元測試。當我的測試項目被初始化時,會創建數據庫的快照,當測試完成時,數據庫會恢復到快照。AssemblyCleanup()測試失敗/異常

下面是執行:

[TestClass] 
public static class AssemblyInitializer 
{ 
    [AssemblyInitialize()] 
    public static void AssemblyInit(TestContext context) 
    { 
     var dbss = new DatabaseSnapshot(...);  
     dbss.CreateSnapshot(); 
    } 

    [AssemblyCleanup()] 
    public static void AssemblyCleanup() 
    { 
     var dbss = new DatabaseSnapshot(...); 
     dbss.RevertDatabase(); 
    } 
} 

現在這所有的作品,但是當我有一個失敗的測試或一些例外出現我的問題。 AssemblyCleanup當然不會被調用,那麼我該如何解決這個問題呢?無論發生什麼情況,快照都必須恢復。這可能嗎?

+0

在單元測試中,您可以添加將在測試完成時執行的代碼。也許看那裏? :) – 2010-05-09 14:39:57

+0

@Oskar我可以做什麼「大會集會」嗎?否則,我必須爲所有測試做到這一點。這是可能的,但我希望更好的解決方案。 – 2010-05-09 15:17:25

+0

我是單元測試新手,但我認爲在單元測試中使用db並不是最佳做法。 http://en.wikipedia.org/wiki/Mock_object – anilca 2010-05-09 15:22:34

回答

0

是的,不要這樣做。有人可能會絆倒電源線。始終複製數據庫文件的已知好的副本並附加它們。查看您使用如何附加的dbase引擎的文檔。

+0

你說得對。也許我應該花更多的時間來模擬ObjectContext。 – 2010-05-10 21:05:17

-2

你認爲AssemblyCleanup不會被調用是錯誤的。除非有人可能「跳過電源線」(如Hans所述),TestCleanup,ClassCleanup和AssemblyCleanup都會執行,無論是否存在異常(或測試失敗)。

請注意,只要您的測試(或測試中的代碼)沒有產生可能會拋出異常的新線程,就是如此。底線:漢斯解決方案更加強大,但對於大多數情況,我發現AssemblyCleanup足夠好,更直接。

+2

這是錯誤的。如果存在未處理的異常,則不會調用「AssemblyCleanup」。請參閱http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assemblycleanupattribute.aspx – CookieMonster 2014-12-11 14:03:32

+1

我很驚訝地看到文檔中的這句話,但它或者是錯誤的,或者我們都不'不明白它究竟是指什麼(我剛剛測試過!)。唯一不會被調用的情況是[AssemblyInitialize]方法內有異常。另外,請參閱[我的博客文章](http://blogs.microsoft.co.il/arnona/2014/09/02/right-way-test-cleanup/)瞭解我的建議處理清理。 – 2015-05-11 18:34:33