Как убедиться, что метод Dispose был вызван для объекта IDisposable и, если возможно, интегрировать его в непрерывную интеграцию? - PullRequest
2 голосов
/ 26 марта 2009

Обычно не вызывая Dispose указывает на возможную ошибку или неаккуратный код и может привести к некоторым трудным для поиска ошибкам. В идеале я хотел бы определить, не был ли вызван метод Disposed во время юнит-тестов.

Одним из методов, которые мы использовали, было поместить Debug.Assert в Финализатор

#if DEBUG
~MyClass()
{
    Debug.Assert(false, “MyClass.Dispose() was not called”);
}
#endif

И мы обнаружили, что перебираем окна сообщений assert, но это не очень хорошо работает со сборками непрерывной интеграции, которые игнорируют всплывающие окна.

Ответы [ 3 ]

3 голосов
/ 26 марта 2009

Если вы регистрируете это каким-либо образом вместо использования Debug.Assert и используете внедрение зависимостей, чтобы указать реализацию логгера, то вы можете использовать фиктивное тестирование, чтобы поймать это. Так, ваш класс может взять экземпляр logger в своем конструкторе или предоставить экземпляр по умолчанию, а затем вести себя так:

public MyClass : IDisposable
{

IEventLogger _eventLogger;

public MyClass() : this(EventLogger.CreateDefaultInstance())
{
}

public MyClass(IEventLogger eventLogger)
{
    _eventLogger = eventLogger;
}

// IDisposable stuff...

#if DEBUG
~MyClass()
{
    _eventLogger.LogError("MyClass.Dispose() was not called");
}
#endif

}
0 голосов
/ 27 марта 2009

Вы можете использовать структуру объектов Mock (например, RhinoMocks), чтобы убедиться, что вызывается IDisposable.Dispose (). Если Dispose () не был вызван, фреймворк автоматически завершится сборкой.

0 голосов
/ 27 марта 2009

Можно написать правило fxCop для обнаружения этой проблемы.

Кроме того, уверенность в том, что все применения IDisposable используются внутри блока using {}, облегчает работу с этим.

правило, которое я проверил для ручных вызовов Dispose () или использования использования {}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...