gpt4 book ai didi

c# - 如何对终结器进行单元测试?

转载 作者:IT王子 更新时间:2023-10-29 04:43:32 25 4
gpt4 key购买 nike

我有以下类,它是 IDisposable 对象的装饰器(我省略了它添加的内容),它本身使用通用模式实现 IDisposable:

public class DisposableDecorator : IDisposable
{
private readonly IDisposable _innerDisposable;

public DisposableDecorator(IDisposable innerDisposable)
{
_innerDisposable = innerDisposable;
}

#region IDisposable Members

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

#endregion

~DisposableDecorator()
{
Dispose(false);
}

protected virtual void Dispose(bool disposing)
{
if (disposing)
_innerDisposable.Dispose();
}
}

我可以很容易地测试 innerDisposable 在调用 Dispose() 时被释放:

[Test]
public void Dispose__DisposesInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();

new DisposableDecorator(mockInnerDisposable.Object).Dispose();

mockInnerDisposable.Verify(x => x.Dispose());
}

但是我该如何编写测试以确保 innerDisposable 不会被终结器处理掉??我想写这样的东西但它失败了,大概是因为终结器还没有被 GC 线程调用:

[Test]
public void Finalizer__DoesNotDisposeInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();

new DisposableDecorator(mockInnerDisposable.Object);
GC.Collect();

mockInnerDisposable.Verify(x => x.Dispose(), Times.Never());
}

最佳答案

我可能误会了,但是:

GC.WaitForPendingFinalizers();

可能会成功 - http://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx

关于c# - 如何对终结器进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2895858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com