Подтвердить что ты не робот

Поиск реальной ошибки в тесте теста Webtest

Я использую Python и Webtest для тестирования приложения WSGI. Я обнаружил, что исключения, возникающие в коде обработчика, как правило, проглатываются с помощью Webtest, который затем генерирует общий код:

AppError: Bad response: 500 Internal Server Error

Как мне сказать, чтобы повысить или распечатать исходную ошибку, вызвавшую это?

4b9b3361

Ответ 1

Структура и сервер WSGI содержат обработчики, которые улавливают исключения и выполняют некоторые действия (отображают стек в теле, записывают обратную трассировку в файл журнала и т.д.). Webtest по умолчанию не показывает фактический ответ, который может быть полезен, если ваша фреймворк создает стек в теле. Я использую следующее расширение для Webtest, когда мне нужно посмотреть на тело ответа:

class BetterTestApp(webtest.TestApp):

    """A testapp that prints the body when status does not match."""

    def _check_status(self, status, res):
        if status is not None and status != res.status_int:
            raise webtest.AppError(
                "Bad response: %s (not %s)\n%s", res.status, status, res)
        super(BetterTestApp, self)._check_status(status, res)

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

Ответ 2

В то время как ответ clj, безусловно, работает, вы все равно можете получить доступ к ответу в своем тестовом примере. Для этого вы можете использовать expect_errors=True (из документация по веб-тестированию), когда вы отправляете свой запрос в TestApp, и таким образом AppError не будет поднят. Вот пример, где я ожидаю ошибку 403:

# attempt to access secure page without logging in
response = testapp.get('/secure_page_url', expect_errors=True)

# now you can assert an expected http code, 
# and print the response if the code doesn't match
self.assertEqual(403, response.status_int, msg=str(response))