Как unit test IDisposable?

Я работаю над фрагментом кода библиотеки около IDisposable. Управляемый путь (через using) легко тестируется. Я задаюсь вопросом о финализаторе, хотя: Является ли вызов System.GC.Collect() достаточным для принудительного запуска финализатора?

Ответ 1

Нет, вызов GC.Collect() является асинхронным, вам также необходимо вызвать это:

System.GC.WaitForPendingFinalizers();

Ответ 2

Я бы посмотрел на Dispose, Finalization и Resource Management его лучшая ссылка на предмет, который я знаю. Используя их шаблон:

~ComplexCleanupBase()
{
    Dispose(false);
}

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected override void Dispose(bool disposing)
{
   if (!disposed)
   {
        if (disposing)
        {
            // dispose-only, i.e. non-finalizable logic
        }

        // new shared cleanup logic
        disposed = true;
    }

    base.Dispose(disposing);
}

Вы завершаете мертвые простые методы Finalizer/Dispose() и проверяемый Dispose (bool). Нет необходимости принудительно завершать или ничего использовать с помощью класса GC.

Ответ 3

Не могли бы вы издеваться над интерфейсом IDisposable и ожидать вызова Dispose? Это, по крайней мере, позволит вам увидеть, когда объект действительно расположен.

Ответ 4

Думаю, я бы склонялся к тому, чтобы заставить Finalize() вызвать другой метод и проверить, что другой метод делает то, что вы хотите. Вы не получите 100% -ный охват кода, но, по крайней мере, вы знаете, что метод правильно освобождает ресурсы объекта.