Тестируемость вашего кода с использованием статических фасадов Entlib сложна.Немного не изменяя свой код, ваш единственный ответ - добавить файл app.config в тестовую сборку и настроить блок исключений Entlib с безобидной политикой, которая ничего не делает.
Однако в Entlib 4 (и5, который я вижу, вы используете) есть другой способ.Мы добавили точку входа экземпляра во все блоки специально для улучшения истории тестируемости.Для блока исключений этот экземпляр - ExceptionManager.Используя это довольно просто.Получите экземпляр диспетчера исключений в свой тип, а затем вызовите его вместо ExceptionPolicy.Примерно так:
public class Whatever {
private ExceptionManager exm;
public Whatever(ExceptionManager exm) { this.exm = exm; }
public bool Foo() {
try {
... do whatever ...
}
catch(NonRecoverableException ex) {
exm.HandleException(ex, "LogException");
return false;
}
}
}
Теперь, когда у вас это есть, вы можете смоделировать ExceptionManager (это абстрактный базовый класс), чтобы практически не открывать его во время теста, либо вручную, либо с помощьюфреймворк фиктивных объектов.
Если вы не хотите заставлять своих пользователей использовать контейнер DI, вы можете добавить конструктор по умолчанию, который получает текущий менеджер исключений:
public class Whatever {
private ExceptionManager exm;
public Whatever() : this(EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>()) { }
public Whatever(ExceptionManager exm) { this.exm = exm; }
}
Конечные пользователииспользуйте конструктор по умолчанию, ваши тесты используют тот, который принимает явный ExceptionManager, и у вас есть ловушка для макетирования всего, что использует Entlib.
Все блоки теперь имеют эти классы "Manager" (где они имеют смыслво всяком случае).