【问题标题】:How can I mock a class method of a celery Task如何模拟芹菜任务的类方法
【发布时间】:2013-11-09 00:03:54
【问题描述】:

使用 python 2.7、celery 3.0.24 和 mock 1.0.1。我有这个:

class FancyTask(celery.Task):
    @classmethod
    def helper_method1(cls, name):
        """do some remote request depending on name"""
        return 'foo' + name + 'bar'

    def __call__(self, *args, **kwargs):
        funcname = self.name.split()[-1]
        bigname = self.helper_method1(funcname)
        return bigname


@celery.task(base=FancyTask)
def task1(*args, **kwargs):
    pass

@celery.task(base=FancyTask)
def task2(*args, **kwargs):
    pass

如何在测试任一任务时修补helper_method1

我尝试过类似的方法:

 import mock
 from mymodule import tasks

 class TestTasks(unittest.TestCase):
     def test_task1(self):
         task = tasks.task1
         task.helper_method1 = mock.MagickMock(return_value='42')
         res = task.delay('blah')
         task.helper_method1.assert_called_with('blah')

测试失败了。原始函数是被调用的函数。不,this question 没有帮助我。

【问题讨论】:

    标签: python unit-testing mocking celery


    【解决方案1】:

    (我没有启动和运行 celery 实例,所以我很难测试它)

    应用程序代码中的目标函数是一个类方法。您的测试代码正在模拟的功能是一个实例方法。

    是否像这样帮助更改 test_task1 -

     def test_task1(self):
         FancyTask.helper_method1 = mock.MagickMock(return_value='42') 
         task = tasks.task1
         res = task.delay('blah')
         task.helper_method1.assert_called_with('blah')
    

    您可能还需要更改 assert_call_with 以便从类级别而不是实例级别调用它。

    改变

         task.helper_method1.assert_called_with('blah')    
    

         FancyTask.helper_method1.assert_called_with('blah')
    

    【讨论】:

    • 致@rahtanoj:原来的helper_method1 正在被调用。 delay 安排任务,芹菜工人立即挑选它。在工作人员的输出中,我看到原始 helper_method1 引发的异常是因为 requests.get 到无法访问的主机。
    • 我没有注意到 helper_method1 是一个类方法。更新了答案以反映这一点。
    • 最后一项更改 - 删除了对 mock 周围的“classmethod”的调用。
    • 同样的,测试失败了。在我看来,在注册任务(custom classes)时,classmethod 代码以某种方式被芹菜掩埋。
    猜你喜欢
    • 2016-05-18
    • 2019-09-13
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多