.net - 在单元测试中检测终结异常

标签 .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();
    }
}

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

最佳答案

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

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

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

关于.net - 在单元测试中检测终结异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10834034/

相关文章:

.net - Silverlight - Resharper 和 VS 设计器无法处理 StaticResource 扩展

testing - 录制脚本 - "page not found"因为单一协议(protocol)?

java - 在Java中将线程更改为进程

.net - Visual Studio : "Target CPU" setting in "Advanced Compiler Settings". 它有什么作用?

.net - 当 switch 语句确实有未处理的情况时,有没有办法让 c# 编译器显示警告?

C# 将 1D 数组拆分为每个第 N 个值的 2D 数组

ssl - 如何在 go 中测试 HTTPS 端点?

oracle - 黑盒测试软件

java - 广播接收器和内存泄漏

android - 在 Eclipse MAT 中,类(class)末尾的美元符号是什么意思?