我正在try 使用python模拟库来修补在Django应用程序中保存模型时运行的Celery 任务,以查看它是否被正确调用.

基本上,任务在myapp.tasks中定义,并在我的模型顶部导入.像这样的py文件:

from .tasks import mytask

...然后在模型中使用mytask.delay(foo, bar)save()上运行.到目前为止还不错——当我真的在用Celery 等植物时,效果很好.

我想构建一个模拟任务的单元测试,只是为了判断是否使用正确的参数调用了它,并且不会实际try 运行Celery 任务.

因此,在测试文件中,我在标准TestCase中获得了类似以下内容:

from mock import patch # at the top of the file

# ...then later
def test_celery_task(self):
    with patch('myapp.models.mytask.delay') as mock_task:
        # ...create an instance of the model and save it etc
        self.assertTrue(mock_task.called)

.但是它从来不会被调用/总是错误的.我try 了各种版本(改为修补myapp.models.mytask,并判断是否调用了mock_task.delay).我从模拟文档中收集到导入路径非常重要,Google搜索告诉我它应该是在测试模块中看到的路径(如果我理解正确的话,应该是myapp.models.mytask.delay而不是myapp.tasks.mytask.delay).

我到底哪里错了?在修补Celery 任务时有没有一些具体的困难?我可以打celery.task号补丁(用来做mytask的装饰师)吗?

推荐答案

你遇到的问题与这是一项Celery 任务无关.你只是碰巧修补了错误的东西.;)

具体地说,您需要找出哪个视图或其他文件正在导入"mytask",并在那里对其进行修补,因此相关的行将如下所示:

with patch('myapp.myview.mytask.delay') as mock_task:

这里还有更多的味道:

http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch

Django相关问答推荐

Django Admin中显示的DateField下面的小提示是什么?

Django为什么我的post.count_view递增2?

Urls.py中路径**kwargs的Django翻译?

在Django ORM中引用非主外键

通过在其他查询中使用来过滤对象

Django基于查询集动态筛选字段名称

无法创建超级用户,因为 Django 中的一列(外键)不能为空

有谁知道是否可以将您的 Django Heroku 应用程序放到 App Store/Google Play 上?

断开连接不会发生

设置 SECURE_HSTS_SECONDS 可以不可逆转地 destruct 您的网站?

Django:想要将一个空字段显示为空白而不是显示无

Django error:不能分配必须是实例

如何创建一个在复选框右侧显示复选框标签的 Django 表单?

如何仅在某些情况下禁用 Django 的 csrf 保护?

ProgrammingError: 安装 Psycopg2 后,关系django_session不存在错误

如何在 django 中将多张图片上传到博客文章

Django中reverse()和reverse_lazy()的区别

Django 用户配置文件

何时使用 Django get_absolute_url() 方法?

从 git 存储库中删除并忽略所有具有扩展名的文件