【发布时间】:2015-05-26 05:53:15
【问题描述】:
我有一个运行 celery 任务的烧瓶应用程序。我正在尝试模拟在该任务深处发生的单个 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
但是,这不起作用,因为(我认为)补丁发生在 Flask 的 Python 进程中,而不是 Celery 正在使用的那个。模拟任务本身不起作用,因为我要测试的是当外部服务返回 'x' 或 'y' 时任务的行为方式。
我们将不胜感激。
【问题讨论】:
标签: unit-testing flask celery python-mock