我有以下的类,它是一个的IDisposable
对象装饰(我省略它添加的东西),这本身实现的IDisposable
使用一个共同的模式:
公共类DisposableDecorator:IDisposable的
{
私人只读了IDisposable _innerDisposable;
公共DisposableDecorator(IDisposable接口innerDisposable)
{
_innerDisposable = innerDisposable;
}
#地区IDisposable的成员
公共无效的Dispose()
{
处置(真);
GC.Sup pressFinalize(本);
}
#endregion
〜DisposableDecorator()
{
处置(假);
}
受保护的虚拟无效的Dispose(BOOL处置)
{
如果(处置)
_innerDisposable.Dispose();
}
}
我可以很容易地测试 innerDisposable
设置时,的Dispose()
被称为:
[测试]
公共无效Dispose__DisposesInnerDisposable()
{
VAR mockInnerDisposable =新的模拟< IDisposable的>();
新DisposableDecorator(mockInnerDisposable.Object).Dispose();
mockInnerDisposable.Verify(X => x.Dispose());
}
但我怎么写一个测试,以确保 innerDisposable
并的没有的得到处理的终结?我想写这样的事情,但它失败,presumably因为终结还没有被调用的GC线程:
[测试]
公共无效Finalizer__DoesNotDisposeInnerDisposable()
{
VAR mockInnerDisposable =新的模拟< IDisposable的>();
新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
I have the following class which is a decorator for an IDisposable
object (I have omitted the stuff it adds) which itself implements IDisposable
using a common pattern:
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();
}
}
I can easily test that innerDisposable
is disposed when Dispose()
is called:
[Test]
public void Dispose__DisposesInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object).Dispose();
mockInnerDisposable.Verify(x => x.Dispose());
}
But how do I write a test to make sure innerDisposable
does not get disposed by the finalizer? I want to write something like this but it fails, presumably because the finalizer hasn't been called by the GC thread:
[Test]
public void Finalizer__DoesNotDisposeInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object);
GC.Collect();
mockInnerDisposable.Verify(x => x.Dispose(), Times.Never());
}
解决方案
I might be misunderstanding, but:
GC.WaitForPendingFinalizers();
Might do the trick - http://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx