Как я могу заставить httpretty прекратить печать исключений во время тестирования? - PullRequest
1 голос
/ 01 августа 2020

У меня есть тест, который имитирует запрос от удаленного сервера, которого не существует:

    @httpretty.activate
    def test_no_such_host(self):

        def no_such_host(request, uri, headers):
            raise requests.ConnectionError()

        httpretty.register_uri(
                'GET',
                EXAMPLE_WEBFINGER_URL,
                status=200,
                headers = {
                    'Content-Type': 'application/jrd+json',
                    },
                body = no_such_host,
                )

        webfinger = get_webfinger(
                EXAMPLE_USERNAME,
                EXAMPLE_HOSTNAME,
                )

        self.assertEqual(
                webfinger.url,
                None,
                )

get_webfinger действительно ловит ConnectionError. Когда он запускается, тест проходит успешно - но он также сообщает об исключении ConnectionError как об ошибке httpretty:

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/home/marnanel/alpha/lib/python3.6/site-packages/httpretty/core.py", line 781, in fill_filekind
    status, headers, self.body = self.callable_body(self.request, self.info.full_url(), headers)
  File "/home/marnanel/proj/kepi/kepi/sombrero_sendpub/tests/test_webfinger.py", line 183, in no_such_host
    raise requests.ConnectionError()
requests.exceptions.ConnectionError

.
----------------------------------------------------------------------
Ran 1 test in 0.117s

OK
Destroying test database for alias 'default'...

В модульном тесте или в тестируемом коде нет потоковой передачи. Это один из множества подобных тестов. Те, которые не связаны с исключениями, все работают отлично.

Как я могу заставить его прекратить печать исключения?

1 Ответ

2 голосов
/ 01 августа 2020

HTTPretty использует поток для имитации тайм-аутов сокетов , но не обрабатывает исключения правильно, см. issue # 334 . Последний предлагает метод обработки исключений, но его не подхватили (пока) сопровождающие.

Однако сообщение, которое вы видите, выводится по умолчанию threading.excepthook() реализация . Вы можете установить свой собственный крючок; безоперационная лямбда заглушит ошибки:

threading.excepthook = lambda a: None

Вы можете использовать диспетчер контекста, чтобы временно отключить ловушку:

import threading
from contextlib import contextmanager

@contextmanager
def suppress_thread_exceptions():
    orig = threading.excepthook
    threading.excepthook = lambda a: None
    try:
        yield
    finally:
        threading.excepthook = orig

, а затем используйте приведенное выше в своих тестах:

with suppress_thread_exceptions():
    # use HTTPretty
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...