Издевательствовать только один метод на объекте

Я знаком с другими издевательскими библиотеками на других языках, таких как Mockito в Java, но библиотека Python mock путает меня жизнь.

У меня есть следующий класс, который я бы хотел проверить.

class MyClassUnderTest(object):

    def submethod(self, *args):
       do_dangerous_things()

    def main_method(self):
       self.submethod("Nothing.")

В моих тестах я хотел бы убедиться, что submethod был вызван при выполнении main_method и что он был вызван с правильными аргументами. Я не хочу, чтобы submethod запускался, так как он делает опасные вещи.

Я совершенно не уверен, как начать с этого. Макет документации невероятно трудно понять, и я не уверен, что даже макет или как насмехаться над этим.

Как я могу фальсифицировать функцию submethod, оставив только функции main_method?

Ответ 1

Я думаю, что вы ищете mock.patch.object

with mock.patch.object(MyClassUnderTest, "submethod") as submethod_mocked:
    submethod_mocked.return_value = 13
    MyClassUnderTest().main_method()
    submethod_mocked.assert_called_once_with(user_id, 100, self.context,
                                             self.account_type)

Вот небольшое описание

 patch.object(target, attribute, new=DEFAULT, 
              spec=None, create=False, spec_set=None, 
              autospec=None, new_callable=None, **kwargs)

исправить именованный элемент (атрибут) объекта (цели) с помощью макета.