he la clase siguiente, que es un decorador para un objeto IDisposable
(he omitido las cosas que se suma) que a su vez implementa IDisposable
usando un patrón común:¿Cómo pruebo la unidad de un finalizador?
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();
}
}
que puede probar fácilmente que innerDisposable
está dispuesto cuando Dispose()
se llama:
[Test]
public void Dispose__DisposesInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object).Dispose();
mockInnerDisposable.Verify(x => x.Dispose());
}
Pero ¿Cómo se escribe una prueba para asegurarse de que no innerDisposable
qué conseguir dispuesto por el finalizador? Quiero escribir algo como esto pero fracasa, presumiblemente porque el finalizador no ha sido llamado por el hilo de GC:
[Test]
public void Finalizer__DoesNotDisposeInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object);
GC.Collect();
mockInnerDisposable.Verify(x => x.Dispose(), Times.Never());
}
[aquí] (http://stackoverflow.com/questions/3259456/should-dispose-methods-be-unit-tested) se puede ver el uso de IDisposable. Eso funcionó bien para mí. –