Модуль логов Mocking для включения отладки, информации, ошибок и т. Д. - PullRequest
0 голосов
/ 06 ноября 2018

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

problem_logging.py:

# problem_logging.py

import logging

class Example:
    def __init__(self):
        logging.info("Example initialized.")
        logging.debug("Debug Info")

test_problem_logging.py:

# test_problem_logging.py

from unittest import TestCase
from unittest.mock import patch
from problem_logging import Example

class TestExample(TestCase):

    def setUp(self):
        self.mock_logging = patch("problem_logging.logging", autospec=True)
        self.mock_logging.start()

    def tearDown(self):
        self.mock_logging.stop()

    def test_init(self): # Fails
        ex = Example()
        self.mock_logging.info.assert_called_once_with("Example initialized.")
        self.mock_logging.debug.assert_called_once_with("Debug Info")

    def test_init_with(self): # Passes
        with patch('problem_logging.logging.info') as mock_info:
            with patch('problem_logging.logging.debug') as mock_debug:
                ex = Example()
                mock_info.assert_called_once_with("Example initialized.")
                mock_debug.assert_called_once_with("Debug Info")

if __name__ == "__main__":
    TestExample()

Проблема:

Error
Traceback (most recent call last):
  File "/usr/lib/python3.5/unittest/case.py", line 58, in testPartExecutor
    yield
  File "/usr/lib/python3.5/unittest/case.py", line 600, in run
    testMethod()
  File "/home/fred/unittest_logging/test_problem_logging.py", line 16, in test_init
    self.mock_logging.info.assert_called_once_with("Example initialized.")
AttributeError: '_patch' object has no attribute 'info'



Ran 2 tests in 0.016s

FAILED (errors=1)

Я хотел бы иметь возможность настроить макет в setUp () и использовать его на протяжении всего этого TestCase, чтобы быть уверенным, что у меня есть доступ ко всем различным уровням журналирования без потенциальных дополнительных пяти слоев отступов, аналогично тому, как MagicMock можно делать с объектами и их методами.

1 Ответ

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

Я нашел решение своей проблемы. Метод _patch.start () возвращает объект MagicMock, необходимый для выполнения утверждений.

# test_problem_logging.py

from unittest import TestCase
from unittest.mock import patch
from problem_logging import Example

class TestExample(TestCase):

    def setUp(self):
        self.mock_logging_module = patch("problem_logging.logging")
        self.mock_logging = self.mock_logging_module.start()


    def tearDown(self):
        self.mock_logging_module.stop()

    def test_init(self): # Fails
        ex = Example()
        self.mock_logging.info.assert_called_once_with("Example initialized.")
        self.mock_logging.debug.assert_called_once_with("Debug Info")

if __name__ == "__main__":
    TestExample()
...