Как смоделировать модуль импорта класса в pytest - PullRequest
0 голосов
/ 09 апреля 2020

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

please_configure.py

from src.messages.create import create_please

class PleaseConfigure():
    def __init__():
        self._call = { "create_please": create_please }

     def handle_call(msg):
         self._call[msg["method"]](msg["args"])

create.py

def create_please(args):
    # does something not so important

test_please_configure.py

from src.consumers.please_configure import PleaseConfigure

@patch.object(PleaseConfigure, "_call")
def test_please_configure_success(mocked_call):
     cf = PleaseConfigure()
     # want to test cf.handle_call()

I упростили вышеупомянутые классы до такой степени, что они, очевидно, больше не делают много, но это правильная иерархия импорта между 3 файлами. Как я должен издеваться над функцией в словаре _call в случаях PleaseConfigure?

В test_please_configure_success я пробовал варианты в следующих случаях:

@patch.object(PleaseConfigure, "_call")
@patch.object(PleaseConfigure, "create_please")
@patch.object(PleaseConfigure, "src.messages.create")
@patch.object(PleaseConfigure, "src.messages.create.create")

Я также пытался делать подобное с помощью контекстных менеджеров. Кажется, он просто не работает и становится довольно разочаровывающим. Спасибо за любую помощь в этой функции, чтобы я мог протестировать класс PleaseConfigure.

1 Ответ

0 голосов
/ 16 апреля 2020

Так сработало следующее.

@patch('src.consumers.please_configure.create_please')
    def test_handle_message(mocked_create):
        cf = PleaseConfigure()

Экземпляр cf имеет dict _call {"create_please": create_please}, который теперь является экземпляром MagicMock и имеет ссылку mocked_create, переданную в качестве аргумента.

...