Python mock() не издевается над возвращаемым значением

У меня возникли проблемы с Python mock(), и я недостаточно знаком, чтобы понять, что с ним происходит.

У меня есть абстрактный класс асинхронной задачи, который выглядит примерно так:

class AsyncTask(object):
    @classmethod
    def enqueue(cls):
        ....
        task_ent = cls.createAsyncTask(body, delayed=will_delay)
        ....

Я хотел бы исправить метод createAsyncTask для конкретного экземпляра этого класса.

Код, который я написал, выглядит так:

@patch.object(CustomAsyncTaskClass, "createAsyncTask")
def test_my_test(self, mock_create_task):
    ....
    mock_create_task.return_value = "12"
    fn()    # calls CustomAsyncTaskClass.enqueue(...)
    ....

Когда я распечатываю task_ent в очереди, я получаю <MagicMock name='createAsyncTask()' id='140578431952144'>

Когда я распечатываю cls.createAsyncTask в очереди, я получаю <MagicMock name='createAsyncTask' id='140578609336400'>

Что я делаю не так? Почему createAsyncTask не возвращает 12?


person user358829    schedule 23.06.2015    source источник
comment
ack, проигнорируйте это - у меня были аргументы для чего-то наоборот. Я не могу понять, как удалить вопрос, извините =(   -  person user358829    schedule 24.06.2015
comment
Было бы намного лучше, если бы вы написали ответ (как бы смешно это ни было) и приняли его.   -  person niCk cAMel    schedule 11.03.2019


Ответы (1)


Попробуйте следующее:

@patch("package_name.module_name.createAsyncTask")
def test_my_test(self, mock_create_task):
    ....
    mock_create_task.return_value = "12"
    fn()    # calls CustomAsyncTaskClass.enqueue(...)
    ....

где module_name — имя модуля, содержащего класс AsyncTask.

В общем, это руководство https://docs.python.org/3/library/unittest.mock.html#where-to-patch

person piggs_boson    schedule 23.06.2015