2013-10-29 49 views
1

使用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沒有幫助我。

回答

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') 
+0

到@rahtanoj:原來'helper_method1'被調用。 '延遲'安排任務,一名芹菜工作人員立即採摘。在worker的輸出中,我看到由於'requests.get'給一個不可訪問的主機而引起的原始'helper_method1'引發的異常。 – mmoya

+0

我沒有注意到helper_method1是一個classmethod。更新了答案以反映這一點。 – rahtanoj

+0

最後一個變化 - 刪除了模擬的'classmethod'調用。 – rahtanoj