Gra*_*meF 19 .net c# unit-testing idisposable finalizer
我有以下类,它是一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以很容易地测试innerDisposable时被布置Dispose()叫做:
[Test]
public void Dispose__DisposesInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object).Dispose();
mockInnerDisposable.Verify(x => x.Dispose());
}
Run Code Online (Sandbox Code Playgroud)
但我怎么写一个测试,以确保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());
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*ins 14
我可能会误解,但是:
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
可能会做的 - http://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx