我有一個運行芹菜任務的瓶子應用程序。我試圖模擬出發生在該任務內部的單個API調用。嘲笑芹菜任務內的呼叫
views.py
from mypackage.task_module import my_task
@app.route('/run_task')
def run_task():
task = my_task.delay()
return some_response
task_module.py
from mypackage.some_module import SomeClass
@celery.task
def my_task():
return SomeClass().some_function()
some_module.py
from mypackage.xyz import external_service
class SomeClass(object):
def some_function(self):
#do some stuff
result = external_service(some_param)
if 'x' in result:
#do something
elif 'y' in result:
#do something else
我想嘲笑Ø取出result = external_service()
行,以便我可以觸發第一個或第二個代碼路徑。
所以這裏就是我想:
@mock.patch('mypackage.some_module.external_service', autospec=True)
def test_x_path(my_mock):
my_mock.return_value = {'x': some_val}
#run test, expect 'x' code path to run
然而,這是不行的,因爲(我認爲)的補丁發生在瓶的Python進程,而不是芹菜是使用一個。嘲笑任務本身將不起作用,因爲我試圖測試的是當外部服務返回'x'
或'y'
時,該任務的行爲如何。
幫助將不勝感激。
有沒有一種方法來設置這個單個測試的只是時間?我的套件中已經有測試異步功能的測試,並且在運行此測試時已經有一大堆芹菜工人正在運行。 –
如果你已經有芹菜工人,那你爲什麼不在工人過程中嘲笑這項工作? – Miguel
那麼,我該怎麼做?我不想在生產代碼中添加任何東西,它必須在測試代碼中完成。 –