【发布时间】: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