2015-05-18 1 views
2

У меня есть тестовый проект NUnit, который запускает тесты против проекта веб-API. Когда на стороне сервера было необработанное исключение, я бы просто получил непрозрачную ошибку HTTP 500, что было очень мало для отладки. Поэтому я искал эту проблему и нашел this article, что помогло мне создать хороший небольшой фильтр особых исключений, и теперь я могу передать детали исключения на стороне сервера в пользовательский интерфейс в ответе.Как получить проект тестирования NUnit для использования настраиваемого фильтра исключений?

В статье объясняется, как получить этот фильтр, чтобы работать во всем мире, путем добавления строки в Application_Start:

GlobalConfiguration.Configuration.Filters.Add(new MyExceptionFilter()); 

К сожалению, эта линия никогда не будет выполняться, когда я бегу мои модульных тестов.

фильтр прекрасно работает, когда я украсит мои методы контроллера с [MyExceptionFilter], но я действительно не хотят, чтобы идти вставив этот декоратор на каждом контроллере в моем API.

Есть ли способ получить проект NUnit для применения этого настраиваемого фильтра исключения по всему миру?

ответ

1

Когда вы выполняете единичный тест, вы выполняете занятия и ничего больше. В случае веб-приложения, которое выполняется на веб-сервере, помимо классов у вас есть много других элементов (Cookies, запросы, ответы, сеансы и т. Д.). В приложении Application_Start, когда вы регистрируете фильтр, вы сообщаете веб-серверу обрабатывать необработанные исключения. Это означает, что сам сервер несет ответственность за эту обработку.

В вашем модульном тесте у вас никогда не было контекста веб-приложения, потому что вы тестируете классы и методы. Плохая идея - ожидать такого поведения, когда вам нужно только проверить атомарность кода.

Например, хороший тест блок может быть (на основании статьи):

  • Если что-то происходит, ожидать бизнес Exception, как CustomerNotFoundException

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

Насколько я знаю, можно издеваться над некоторыми частями веб-приложения (например, для эмуляции файлов cookie в поддельном HttpContext, здесь много ответов в StackOverflow). Всегда нужно избегать этого, потому что вам нужно отделить свои тесты от внешнего поведения и, конечно же, высмеять весь веб-процесс намного сложнее и менее выгодно.

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

+0

Привет, спасибо за объяснение. Я не собираюсь обрабатывать конкретные исключения; Я ищу общий случай catch, когда единичный тест ломается, и я не знаю, почему, например. кто-то проверял код, который испортил что-то на стороне сервера, и теперь все, что я знаю, это то, что мои модульные тесты бросают ошибки HTTP 500. Мне нужно уметь отлаживать те модульные тесты, чтобы понять, что пошло не так. –