Как провести юнит-тестирование IDisposable?
-
05-07-2019 - |
Вопрос
Я работаю над фрагментом библиотечного кода вокруг IDisposable
. Управляемый путь (через using
) легко тестируется. Хотя мне интересно узнать о финализаторе: он звонит System.GC.Collect ()
достаточно для запуска финализатора?
Решение
Нет, вызов GC.Collect () является асинхронным, вам также необходимо вызвать его:
System.GC.WaitForPendingFinalizers();
Другие советы
Я хотел бы взглянуть на утилизировать , Завершение и управление ресурсами это лучшая ссылка на тему, которую я знаю. Используя их шаблон:
~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.
Не могли бы вы макетировать интерфейс IDisposable
и ожидать вызова Dispose
? Это, по крайней мере, позволит вам увидеть, когда объект действительно будет удален.
Я думаю, я бы склонялся к тому, чтобы Finalize () вызывал другой метод, и проверял бы, что другой метод делает то, что вы хотите. Вы не получите 100% покрытия кода, но по крайней мере вы будете знать, что метод правильно высвобождает ресурсы объекта.