首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Django单元测试中使用mock修补芹菜任务

在Django单元测试中使用mock修补芹菜任务
EN

Stack Overflow用户
提问于 2013-08-13 22:40:59
回答 3查看 21.1K关注 0票数 41

我正在尝试使用python mock库来修补一个芹菜任务,该任务是在我的django应用程序中保存模型时运行的,以查看它是否被正确调用。

基本上,任务是在myapp.tasks中定义的,并导入到我的models.py文件的顶部,如下所示:

from .tasks import mytask

然后,...and使用mytask.delay(foo, bar)在模型内部的save()上运行。到目前为止还不错-当我实际运行Celeryd等时,运行得很好。

我想构建一个模拟任务的单元测试,只是为了检查是否使用正确的参数调用了它,而不是真正尝试运行芹菜任务。

所以在测试文件中,我在一个标准的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)

...but它从不被调用/总是为false。我尝试过不同的版本(改为修补myapp.models.mytask,并检查是否调用了mock_task.delay。我从模拟文档中收集到导入路径是至关重要的,谷歌搜索告诉我,它应该是在测试模块中看到的路径(如果我理解正确的话,应该是myapp.models.mytask.delay而不是myapp.tasks.mytask.delay )。

我在哪里做错了?在修补芹菜任务时是否存在一些特定的困难?我可以给celery.task打补丁(它被用作mytask的装饰器)吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-09 04:04:31

您遇到的问题与这是一项芹菜任务的事实无关。你只是碰巧修补了错误的东西。;)

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

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

这里还有更多的味道:

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

票数 54
EN

Stack Overflow用户

发布于 2015-03-26 08:46:45

@task装饰器用Task对象替换该函数(请参见documentation)。如果模拟任务本身,您将用MagicMock替换(有点神奇的) Task对象,它根本不会调度任务。相反,模拟Task对象的run()方法,如下所示:

@override_settings(CELERY_ALWAYS_EAGER=True)
@patch('monitor.tasks.monitor_user.run')
def test_monitor_all(self, monitor_user):
    """
    Test monitor.all task
    """

    user = ApiUserFactory()
    tasks.monitor_all.delay()
    monitor_user.assert_called_once_with(user.key)
票数 36
EN

Stack Overflow用户

发布于 2022-02-24 00:42:37

只需修补芹菜任务方法

mocker.patch("celery.app.task.Task.delay", return_value=1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18212131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档