我在使用 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(...)
    ....

当我在 enqueue 中打印 task_ent 时,我得到 <MagicMock name='createAsyncTask()' id='140578431952144'>
当我在 enqueue 中打印 cls.createAsyncTask 时,我得到 <MagicMock name='createAsyncTask' id='140578609336400'>
我究竟做错了什么?为什么 createAsyncTask 不会返回 12?

最佳答案

请尝试以下操作:

@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

关于Python mock() 不 mock 返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31014939/

10-10 09:31