У меня есть фляжное приложение, которое запускает задачу сельдерея. Я пытаюсь смоделировать один вызов 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 Flask, а не в том, который использует Celery. Имитация самой задачи не сработает, поскольку я пытаюсь проверить, как ведет себя задача, когда внешняя служба возвращает 'x'
или 'y'
.
Помощь будет высоко оценена.