2

有没有办法强制在单元测试期间创建的所有对象完成?我一直遇到的问题是,由于丢失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();
    }
}

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

4

1 回答 1

0

在我看来,您实际上想要测试 Dispose 方法。如果是这样,为什么不直接调用 Dipose 方法呢?

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

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

于 2012-05-31T14:05:16.490 回答