首页 > 解决方案 > Python 测试:模拟在另一个函数中导​​入和使用的函数

问题描述

由于 Django 中的 Celery 任务常见的循环导入问题,我经常在我的方法中导入 Celery 任务,如下所示:

# some code omitted for brevity
# accounts/models.py
def refresh_library(self, queue_type="regular"):
    from core.tasks import refresh_user_library 

    refresh_user_library.apply_async(
        kwargs={"user_id": self.user.id}, queue=queue_type
    )
    return 0

在我的pytest测试中refresh_library,我只想测试refresh_user_library(芹菜任务)是用正确的argsand调用的kwargs。但这不起作用:

# tests/test_accounts_models.py
@mock.patch("accounts.models.UserProfile.refresh_library.refresh_user_library")
def test_refresh_library():

错误是关于refresh_library没有属性refresh_user_library

我怀疑这是因为 task( refresh_user_library) 是在函数本身内部导入的,但我对模拟没有太多经验,所以这可能是完全错误的。

标签: pythondjangopytestpython-mock

解决方案


即使apply_async是您自己创建的函数core.tasks,如果您不想测试它而只想确保提供正确的参数,则需要模拟它。在您的问题中,您正在嘲笑错误的包裹。你应该做:

# tests/test_accounts_models.py
@mock.patch("core.tasks.rehresh_user_library.apply_sync")
def test_refresh_library():

推荐阅读