Ho la seguente classe che è un decoratore per un oggetto IDisposable
(ho omesso la roba aggiunge) che si attua IDisposable
utilizzando un modello comune:Come posso testare un finalizzatore?
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 può facilmente verificare che innerDisposable
è disposta quando Dispose()
si chiama:
[Test]
public void Dispose__DisposesInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object).Dispose();
mockInnerDisposable.Verify(x => x.Dispose());
}
Ma come faccio a scrivere un test per assicurarsi che innerDisposable
fa non ottenere disposto dal finalizzatore? Voglio scrivere qualcosa di simile, ma viene a mancare, presumibilmente perché il finalizzatore non è stato chiamato dal thread GC:
[Test]
public void Finalizer__DoesNotDisposeInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object);
GC.Collect();
mockInnerDisposable.Verify(x => x.Dispose(), Times.Never());
}
[qui] (http://stackoverflow.com/questions/3259456/should-dispose-methods-be-unit-tested) si può vedere l'uso di IDisposable. Questo ha funzionato bene per me. –