user358829
user358829

Reputation: 761

Python mock() not mocking the return value

I'm having some trouble with Python mock() and I'm not familiar enough to figure out what's going on with it.

I have an abstract async task class that looks something like:

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

I'd like to patch the createAsyncTask method for a specific instance of this class.

The code I wrote looks like:

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

When I print out task_ent in enqueue, I get <MagicMock name='createAsyncTask()' id='140578431952144'>

When I print out cls.createAsyncTask in enqueue, I get <MagicMock name='createAsyncTask' id='140578609336400'>

What am I doing wrong? Why won't createAsyncTask return 12?

Upvotes: 4

Views: 6181

Answers (2)

Zmall
Zmall

Reputation: 11

I know that this question is old but I just had the same problem and fixed it now.

If you patch multiple functions it is very important to keep the order in mind. It has to be reversed from the patches.

@patch("package_name.function1")
@patch("package_name.function2")
def test_method(
mocked_function2: MagicMock,
mocked_function1: MagicMock
)

Upvotes: 1

piggs_boson
piggs_boson

Reputation: 1007

Try the following:

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

where module_name is the name of the module which contains the class AsyncTask.

In general, this is the guideline https://docs.python.org/3/library/unittest.mock.html#where-to-patch

Upvotes: 3

Related Questions