【问题标题】:Detecting finalize exceptions within a unit test在单元测试中检测 finalize 异常
【发布时间】:2012-06-05 17:39:41
【问题描述】:

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

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

【问题讨论】:

  • 很少需要终结器。你确定你需要一个吗?
  • 这是一个加载原生类的 C++/CLI 类。终结器是 C++/CLI 类可以删除它。

标签: .net testing memory-leaks finalize


【解决方案1】:

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

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

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

【讨论】:

  • 不完全。我想测试在给定测试运行期间创建的任何对象的终结器中是否存在问题。在比我上面的小示例更复杂的情况下,是否可以确保函数期间创建的对象在完成时不会崩溃?
猜你喜欢
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2011-06-21
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
相关资源
最近更新 更多