2012-05-31 56 views
2

是否有強制在單元測試期間創建的所有對象最終確定的方法?我一直遇到的問題是,當進程本身(而不是AppDomain!)終止時,由於丟失GCHandle實例而導致的任何泄漏似乎都已最終確定,這是在程序集中的所有測試都已運行(並且可能「通過」)之後, 。在單元測試中檢測完成異常

我最好的,但還不夠,嘗試在C#:

class Foo : IDisposable 
{ 
    ~Foo() { Dispose(); } 
    public void Dispose() { throw new Exception(); } 
} 

[TestClass] 
public class Finalise 
{ 
    void bar() 
    { 
     GCHandle.Alloc(new Foo()); // leak 
    } 

    [TestMethod] 
    public void DetectFinalizeException() 
    { 
     bar(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 
} 

運行,這將導致一個「合格」的測試,但有一個通知後臺線程有未處理的異常。在具有多個測試的裝配中,這並不理想。

+0

需要一個終結器是非常罕見的。你確定你需要嗎? – jason

+0

這是一個加載本地類的C++/CLI類。終結者是這樣的,C++/CLI類可以刪除它。 – Ayjay

回答

0

在我看來,你真的想測試Dispose方法。如果是這種情況,爲什麼不直接調用Dipose方法?

GC將在調用它的線程上運行。所以另一種方法是在測試中調用GC.Collection方法。

編輯:你有沒有在單元測試中試過撥打GC.Collect?我從來沒有必要做你想做的事,但是從我所瞭解的garabage收集器應該在你的單元測試的線程中運行,從而允許你的單元測試捕捉任何異常。

+0

不完全。我想測試在給定測試運行期間創建的任何對象中的終結者中沒有問題。在比我上面的小樣本更復雜的情況下,是否有可能確保函數期間創建的對象在最終確定時不會崩潰? – Ayjay