Как правило, ваша обработка исключений будет выглядеть следующим образом:
public class EntryPointClass
{
Logger _logfile;
// ...
public void DoIt(string Data)
{
var logicClass = new MyClass();
try
{
logicClass.DoSomething(Data);
}
catch(NullReferenceException ex)
{
_logfile.WriteLine("null reference exception occured in method 'DoIt'");
}
}
}
(Logger
- это просто пример ресурса, который необходим для правильной обработки исключений, недоступной в том месте, где живет MyClass
Вы также можете добавить отображение окна сообщения здесь или что-то в этом роде.)
На уровне MyClass
у вас обычно нет доступных инструментов для правильной обработки исключений (и вы нене хочу добавлять их туда, чтобы отделить класс от, например, определенного механизма ведения журналов).
Обратите внимание, что это проектное решение не зависит от выполнения TDD.Если вы хотите, чтобы ваш класс MyClass
действительно перехватывал исключения самостоятельно, вы должны писать свои тесты по-другому, это правильно.Но это только хорошая идея, если перехват исключений не блокирует ваши автоматические тесты.Попробуйте, например, написать хороший модульный тест для MyClass
, когда MyClass
показывает жестко закодированное диалоговое окно с предупреждением.
Конечно, приведенный выше пример показывает, что модульное тестирование EntryPointClass
может усложнитьсяреальность, когда вам сначала нужно что-то вроде логгера, чтобы все заработало.В общем, вы можете атаковать эту проблему, предоставляя регистратору во время строительства, используя интерфейс ILogger, который позволяет заменять регистратор на макет.Или в этом простом случае может быть достаточно вообще не инициализировать регистратор для ваших модульных тестов и кодировать его следующим образом:
public class EntryPointClass
{
// ....
catch(NullReferenceException ex)
{
if(_logfile!=null)
_logfile.WriteLine("null reference exception occured in method 'DoIt'");
}
// ....
}