python - 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
(芹菜任务)是用正确的args
and调用的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
) 是在函数本身内部导入的,但我对模拟没有太多经验,所以这可能是完全错误的。
解决方案
即使apply_async
是您自己创建的函数core.tasks
,如果您不想测试它而只想确保提供正确的参数,则需要模拟它。在您的问题中,您正在嘲笑错误的包裹。你应该做:
# tests/test_accounts_models.py
@mock.patch("core.tasks.rehresh_user_library.apply_sync")
def test_refresh_library():
推荐阅读
- ruby - 如何检查在另一个方法 rspec 中调用的方法的返回值?
- snowflake-cloud-data-platform - 雪花拉动 MaestroQA 数据
- shell - MobaXtern - 如何在 Moba 自己的 bash 终端中运行 bash shell 脚本?
- sql - Access 或 SQL:需要帮助从在查询中动态选择字段名称的字段返回数据
- api - 无法将 APIMan 中的端点 URL 更改为公共 IP
- flutter - “FirebaseMessaging”类没有默认构造函数 Flutter 2
- go - Go 在使用 new(string) 时如何分配内存
- android - 如何删除 Flutter 项目中的 ios 文件夹?
- firebase - 为什么 Google 在自己的多租户应用程序文档中不推荐 Google Firebase?
- python - 将 Panda 列拆分为多行