Это поможет, если вы расскажете больше о своем конкретном сценарии.
Не похоже, что вы запускаете модульные тесты, если они отправляют электронные письма. Единицы кода не должны контролировать или действительно иметь какие-либо знания о конкретных типах сообщений об ошибках, если они не могут легко конфигурироваться на уровне приложения.
Звучит так, как будто вы пытаетесь взломать что-то, что неправильно настроено. Если проблема некритическая, и это безопасно для продолжения, то вы, вероятно, должны просто использовать регистратор, а затем соответствующим образом реагировать на ошибку. Вероятно, есть приложение log4net, которое отправляет электронные письма, если вам все еще нужны эти функции (и если вы не настроите log4net, это ничего не сделает, поэтому ваши тесты не будут отправлять какие-либо письма).
Это не влияет на тестируемость, поскольку вы можете подать условие ошибки, а затем проверить, был ли получен соответствующий ответ (например, «если я не могу прочитать файл конфигурации, а затем вернуть значения по умолчанию»).
Если вы обнаруживаете фатальные ошибки, вы должны посмотреть на создание обработчика исключений на верхнем уровне вашего приложения (т. Е. Сразу после его запуска). Вы можете сделать это, проводя проводку для события AppDomain.UnhandledException среди прочего. Таким образом, если исключение необработанно, вы все равно сможете его поймать правильно, отправьте электронное письмо через обработчик исключений, а затем прекратите приложение изящно.
Вы только установили обработчик исключений в начале обычного запуска приложения. Сохранить для начальной фазы загрузки/подключения, ваше приложение не знает об этом. Ваши единицы кода не будут знать, и вы можете протестировать, как обычно.
Сервисные локаторы действительно являются хорошим решением. –
krystan: Мне они не нравятся, поскольку они скрывают зависимости и загрязняют код приложения с помощью вызовов «получить эту услугу, установить эту услугу». Конструкторский DI означает, что приложение даже не будет построено, если зависимости не будут выполнены. С DI, легко смотреть на любой фрагмент кода изолированно и рассуждать о его зависимостях. –
Оценка: справедливая точка. Причина, по которой я не обсуждал DI подробно, заключается в том, что для этого требуется гораздо больше объяснений, чем упрощенный подход к локальному сервису, а DI на основе конструктора, вероятно, потребует значительно более рефакторинга исходного приложения плаката, чем локатор сервисов. Но, безусловно, существует вероятность того, что правильный DI, скорее всего, будет более ремонтоприемным, поскольку сценарий станет более сложным. – itowlson