我有以下类,这是用于IDisposable
对象一个装饰(I省略其添加的东西),其本身使用一个共同的模式实现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());
}
[Here](http://stackoverflow.com/questions/3259456/should-dispose-methods-be-unit-tested)你可以看到使用IDisposable。这对我来说很好。 – 2016-07-22 15:24:25