c# – 我如何写一个单元测试来确定一个对象是否可以被垃圾收集?

关于my previous question,我需要检查一个将被Castle Windsor实例化的组件是否可以在我的代码完成使用后被垃圾收集。我试过在上一个问题的答案中的建议,但它似乎没有按预期工作,至少对我的代码。所以我想编写一个单元测试,测试一个特定的对象实例是否可以在我的一些代码运行后进行垃圾回收。

这是可能做到可靠的方式吗?

编辑

我目前有以下测试基于Paul Stovell的答案,它的成功:

     [TestMethod]
    public void ReleaseTest()
    {
        WindsorContainer container = new WindsorContainer();
        container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy();
        container.AddComponentWithLifestyle<ReleaseTester>(LifestyleType.Transient);
        Assert.AreEqual(0, ReleaseTester.refCount);
        var weakRef = new WeakReference(container.Resolve<ReleaseTester>());
        Assert.AreEqual(1, ReleaseTester.refCount);
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Assert.AreEqual(0, ReleaseTester.refCount, "Component not released");
    }

    private class ReleaseTester
    {
        public static int refCount = 0;

        public ReleaseTester()
        {
            refCount++;
        }

        ~ReleaseTester()
        {
            refCount--;
        }
    }

我可以假设,基于上面的测试,我可以得出结论,当使用NoTrackingReleasePolicy时,Windsor不会泄漏内存?

这是我通常做的:

[Test]
public void MyTest() 
{
    WeakReference reference;
    new Action(() => 
    {
        var service = new Service();
        // Do things with service that might cause a memory leak...

        reference = new WeakReference(service, true);
    })();

    // Service should have gone out of scope about now, 
    // so the garbage collector can clean it up
    GC.Collect();
    GC.WaitForPendingFinalizers();

    Assert.IsNull(reference.Target);
}

注意:有非常,很少的时间,你应该在生产应用程序中调用GC.Collect()。但是测试泄漏是一个适当的例子。

http://stackoverflow.com/questions/578967/how-can-i-write-a-unit-test-to-determine-whether-an-object-can-be-garbage-collec

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 我如何写一个单元测试来确定一个对象是否可以被垃圾收集?