2008-10-29 3 views
10

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

+0

Если вы придерживаетесь предписанного шаблона для IDisposable, я уверен, что его тестирование будет полезным. – 2008-10-29 10:49:21

+0

извините, это должно было быть «Я не уверен, что модульное тестирование будет таким полезным ... – 2008-10-29 10:58:53

+0

@Mitch: реализация IDisposable правильно, так что управляемые и неуправляемые ресурсы удаляются в нужный момент не тривиально . Поскольку соответствующий код библиотеки отвечает за то, что я не вижу смысла в тестировании _not_, что ... – 2008-10-29 11:01:53

ответ

8

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

System.GC.WaitForPendingFinalizers(); 
0

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

0

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

2

Я бы посмотрел на Dispose, Finalization, and 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); 
} 

Вы завершаете с мертвыми простых Финалайзер/Dispose() методы и проверяемые Dispose (BOOL). Нет необходимости принудительно завершать работу или что-либо, используя класс GC.

Смежные вопросы