Como faço para testar a unidade de um finalizador?

Eu tenho a seguinte classe, que é decoradora de umIDisposable objeto (omiti o material que ele adiciona) que implementaIDisposable usando um padrão comum:

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();
    }
}

Eu posso facilmente testar issoinnerDisposable é descartado quandoDispose() é chamado:

[Test]
public void Dispose__DisposesInnerDisposable()
{
    var mockInnerDisposable = new Mock<IDisposable>();

    new DisposableDecorator(mockInnerDisposable.Object).Dispose();

    mockInnerDisposable.Verify(x => x.Dispose());
}

Mas como eu escrevo um teste para garantirinnerDisposable faznão ser descartado pelo finalizador? Quero escrever algo assim, mas falha, provavelmente porque o finalizador não foi chamado pelo thread do GC:

[Test]
public void Finalizer__DoesNotDisposeInnerDisposable()
{
    var mockInnerDisposable = new Mock<IDisposable>();

    new DisposableDecorator(mockInnerDisposable.Object);
    GC.Collect();

    mockInnerDisposable.Verify(x => x.Dispose(), Times.Never());
}

questionAnswers(4)

yourAnswerToTheQuestion