2012-05-31 33 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