Убедитесь, что logging.critical ударил с помощью юнит-тестов Python - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть код на python, как показано ниже:

import logging

def method():
  value = get_value()
  if value is not None:
    do_something()
  else:
    logging.critical("value cannot be None")

Я хотел написать модульный тест, чтобы охватить оба вышеупомянутых сценария.Первый случай успеха был легким.Но для сценария сбоя, как правильно отлавливать, что logging.critical был назван?

Я попытался поместить метод в блок try-кроме, и он работает.

... Mock required function and specify return values ...
try:
  method()
except Exception as ex:
  import traceback
  traceback.format_exc()

Хотя вышеуказанный метод работает, я не думаю, что правильно понял, что logging.critical был вызван, а не вызвано исключение.Как правильно это сделать?

1 Ответ

0 голосов
/ 17 февраля 2019

Вы можете издеваться над регистратором.Но вы в настоящее время используете регистратор по умолчанию, который вы не хотите издеваться.Вы можете изменить свой код так, чтобы он использовал специфичный для модуля регистратор:

import logging

logger = logging.getLogger(__name__)

def method():
  value = get_value()
  if value is not None:
    return True
  else:
    logger.critical("value cannot be None")

Вместо method доступа к этому глобальному объекту регистратора, вы можете передать объект Logger в качестве аргумента method или иметь классвокруг метода и сделать объект Logger членом класса и т. д.

Однако, оставаясь с примером как есть, вы можете затем смоделировать этот объект logger и утверждать, что он вызывается, как и ожидалось:

import unittest
import unittest.mock

class TestStringMethods(unittest.TestCase):

    def test_method_withNone_shallLogCritical(self):
        # setup
        global logger
        tmpLogger = logger
        logger = unittest.mock.Mock()

        # exercise
        method()

        # verify
        logger.critical.assert_called() # python >= 3.6

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