检测单元测试中的最终异常

时间:2012-05-31 12:53:34

标签: .net testing memory-leaks finalize

有没有办法强制在单元测试期间创建的所有对象完成?我一直遇到的问题是,当进程本身(而不是GCHandle!)终止时,由于丢失AppDomain实例导致的任何泄漏似乎都已完成,这是在程序集中的所有测试之后跑(并可能“通过”)。

我最好,但不充分,尝试使用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();
    }
}

运行此命令将导致“已通过”测试,但会通知后台线程有未处理的异常。在具有多个测试的装配中,这不太理想。

1 个答案:

答案 0 :(得分:0)

在我看来,你真的想测试Dispose方法。如果是这种情况,为什么不直接调用Dipose方法?

GC将在调用它的线程上运行。因此,另一种方法是在测试中调用GC.Collection方法。

编辑:您是否尝试过在单元测试中调用GC.Collect?我从来不需要完全按照你要做的去做,但据我所知,garabage收集器应该在你的单元测试的线程中运行,从而允许你的单元测试捕获任何异常。