Python 如何模拟芹菜任务的类方法
使用Python2.7、Cellery 3.0.24和mock 1.0.1。我有这个: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, **
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:originalhelper\u method1
正在被调用<代码>延迟
安排任务,芹菜工人会立即挑选它。在worker的输出中,我看到原始的helper\u方法1
引发了异常,因为请求了一个无法访问的主机。我没有注意到helper\u方法1是一个classmethod。更新了答案以反映这一点。最后一个更改-删除了围绕mock对“classmethod”的调用。同样,测试失败。在我看来,classmethod
代码在注册任务()时被芹菜掩埋了。