Как написать модульный тест для необработанного обработчика исключений - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть функция для перехвата необученных исключений, ниже.Есть ли способ написать модульный тест, который будет выполнять функцию uncaught_exception_handler(), но выйти из теста нормально?

import logging

def config_logger():
    # logger setup here

def init_uncaught_exception_logger(logger):
    '''Setup an exception handler to log uncaught exceptions.

    This is typically called once per main executable.
    This function only exists to provide a logger context to the nested function.

    Args:
        logger (Logger): The logger object to log uncaught exceptions with.
    '''
    def uncaught_exception_handler(*exc_args):
        '''Log uncaught exceptions with logger.

        Args:
            exc_args: exception type, value, and traceback
        '''
        print("Triggered uncaught_exception_handler")
        logger.error("uncaught: {}: {}\n{}".format(*exc_args))

    sys.excepthook = uncaught_exception_handler

if __name__ == '__main__':
    LOGGER = config_logger()
    init_uncaught_exception_logger(LOGGER)
    raise Exception("This is an intentional uncaught exception")

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вместо того, чтобы проверять, что ваша функция вызывается для неперехваченных исключений, вероятно, лучше вместо этого проверить, что установлен excepthook и что функция работает правильно, когда вы вызываете ее вручную.Это дает вам довольно убедительные доказательства того, что excepthook будет вести себя правильно при реальном использовании.Вы захотите переместить свой uncaught_exception_handler за пределы init_uncaught_exception_logger, чтобы ваши тесты могли получить к нему более легкий доступ.

assert sys.excepthook is uncaught_exception_handler
with your_preferred_output_capture_mechanism:
    try:
        1/0
    except ZeroDivisionError:
        uncaught_exception_handler(*sys.exc_info())
assert_something_about_captured_output()

Если вы действительно хотите вызвать excepthook через необработанное исключение, тогда вы 'Вам нужно будет запустить подпроцесс и проверить его вывод.Модуль subprocess - путь для этого.

0 голосов
/ 22 ноября 2018

Для того чтобы написать утверждения о возбужденных исключениях, вы можете использовать pytest.raises в качестве диспетчера контекста, например, так:

с повышениями (ожидаемое_ исключение: исключение [, соответствие][, message])

import pytest

def test_which_will_raise_exception():
    with pytest.raises(Exception):
        # Your function to test.

Теперь этот модульный тест пройдет, только если какой-либо код в менеджере контекста pytest.raises вызовет исключение, предоставленное в качестве параметра.В данном случае это Exception.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...