Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何模拟芹菜任务的类方法_Python_Unit Testing_Mocking_Celery - Fatal编程技术网

Python 如何模拟芹菜任务的类方法

Python 如何模拟芹菜任务的类方法,python,unit-testing,mocking,celery,Python,Unit Testing,Mocking,Celery,使用Python2.7、Cellery 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, **

使用Python2.7、Cellery 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\u 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')
测试失败了。原始函数就是被调用的函数。不,没有帮助我。

(我没有一个芹菜实例正在运行,所以我很难测试它)

应用程序代码中的目标函数是classmethod。测试代码模拟的函数是一个实例方法

这样更改测试任务1是否有帮助-

 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_,以便从类级别而不是实例级别调用它

改变

     task.helper_method1.assert_called_with('blah')    

(我没有一个芹菜实例启动并运行,因此很难对其进行测试)

应用程序代码中的目标函数是classmethod。测试代码模拟的函数是一个实例方法

这样更改测试任务1是否有帮助-

 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_,以便从类级别而不是实例级别调用它

改变

     task.helper_method1.assert_called_with('blah')    


到@rahtanoj:正在调用原始的
helper\u方法1
<代码>延迟安排任务,芹菜工人会立即挑选它。在worker的输出中,我看到原始的
helper\u方法1
引发了异常,因为
请求了一个无法访问的主机。我没有注意到helper\u方法1是一个classmethod。更新了答案以反映这一点。最后一个更改-删除了围绕mock对“classmethod”的调用。同样,测试失败。在我看来,在注册任务()时,
classmethod
代码不知何故被芹菜掩埋了。对@rahtanoj:original
helper\u method1
正在被调用<代码>延迟
安排任务,芹菜工人会立即挑选它。在worker的输出中,我看到原始的
helper\u方法1
引发了异常,因为
请求了一个无法访问的主机。我没有注意到helper\u方法1是一个classmethod。更新了答案以反映这一点。最后一个更改-删除了围绕mock对“classmethod”的调用。同样,测试失败。在我看来,
classmethod
代码在注册任务()时被芹菜掩埋了。