使用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没有帮助我。
答案 0 :(得分:1)
(我没有芹菜实例运行,因此我很难对其进行测试)
应用程序代码中的目标函数是一种类方法。您的测试代码模拟的函数是一个实例方法。
更改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_called_with,以便从类级别而不是实例级别调用它。
变化
task.helper_method1.assert_called_with('blah')
到
FancyTask.helper_method1.assert_called_with('blah')