Как провести юнит-тестирование IDisposable? - PullRequest
10 голосов
/ 29 октября 2008

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

Ответы [ 4 ]

8 голосов
/ 29 октября 2008

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

System.GC.WaitForPendingFinalizers();
2 голосов
/ 11 февраля 2009

Я бы взглянул на Распоряжение, завершение и управление ресурсами это лучшая ссылка на предмет, который я знаю. Используя их шаблон:

~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) Нет необходимости форсировать Finalization или что-либо еще с помощью класса GC.

0 голосов
/ 30 октября 2008

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

0 голосов
/ 29 октября 2008

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

...