有没有办法在函数内模拟烧瓶请求对象?
Is there a way to mock flask request object inside a function?
我需要测试一个方法的响应,这个方法调用了 2 个不同的方法。该方法的响应是针对这两个内部方法创建的。内部方法 1 在其实现中使用 flask 请求对象作为输入。
代码示例更好地解释了它:
class ApiDetail():
def process_data(self, process_input):
try:
request_simple_url = self.handle_url(request.base_url, request.view_args)
return self.validate_input(request_simple_url, process_input)
except NotFoundException as e:
return {"error": str(e)}, HTTPStatus.UNAUTHORIZED
#implementation detail
@staticmethod
def handle_url(request_base_url, request_arguments):
#implementation detail
def test_process_data():
with mock.patch('ApiDetail.validate_input', return_value = NotFoundException):
with mock.patch('ApiDetail.handle_url', return_value='test_handled'):
assert ApiDetail.process_data(self=ApiDetail, process_input='test_input') == NotFoundException
我正在尝试测试 process_data 方法。如果 validate_input 方法有异常,我也断言 process_data returns 异常。这行有问题,我无法模拟 request 对象,因为它不是 process_data 方法的输入:
request_simple_url = self.handle_url(request.base_url, request.view_args)
错误信息很清楚,但我找不到方法:
name = 'request'
def _lookup_req_object(name):
top = _request_ctx_stack.top
if top is None:
raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context. This typically means that you attempted
to use functionality that needed an active HTTP request.
Consult the documentation on testing for information about how to avoid this problem.
如果 handle_url 在没有任何输入值的情况下实现,它将正常工作,但需要从方法外接收请求对象属性。
有什么办法可以解决这个问题吗?
您可以在 process_data 方法之外使用全局请求对象,并将其属性传递给您的方法:
class ApiDetail():
base_url = request.base_url
view_args = request.view_args
def process_data(self, process_input, base_url, view_args):
try:
request_simple_url = self.handle_url(base_url, view_args)
return self.validate_input(request_simple_url, process_input)
except NotFoundException as e:
return {"error": str(e)}, HTTPStatus.UNAUTHORIZED
#implementation detail
@staticmethod
def handle_url(request_base_url, request_arguments):
#implementation detail
def test_process_data():
with mock.patch('ApiDetail.validate_input', return_value = NotFoundException):
with mock.patch('ApiDetail.handle_url', return_value='test_handled'):
assert ApiDetail.process_data(self=ApiDetail, process_input='test_input', base_url='test_url', view_args='test_args') == NotFoundException
我需要测试一个方法的响应,这个方法调用了 2 个不同的方法。该方法的响应是针对这两个内部方法创建的。内部方法 1 在其实现中使用 flask 请求对象作为输入。
代码示例更好地解释了它:
class ApiDetail():
def process_data(self, process_input):
try:
request_simple_url = self.handle_url(request.base_url, request.view_args)
return self.validate_input(request_simple_url, process_input)
except NotFoundException as e:
return {"error": str(e)}, HTTPStatus.UNAUTHORIZED
#implementation detail
@staticmethod
def handle_url(request_base_url, request_arguments):
#implementation detail
def test_process_data():
with mock.patch('ApiDetail.validate_input', return_value = NotFoundException):
with mock.patch('ApiDetail.handle_url', return_value='test_handled'):
assert ApiDetail.process_data(self=ApiDetail, process_input='test_input') == NotFoundException
我正在尝试测试 process_data 方法。如果 validate_input 方法有异常,我也断言 process_data returns 异常。这行有问题,我无法模拟 request 对象,因为它不是 process_data 方法的输入:
request_simple_url = self.handle_url(request.base_url, request.view_args)
错误信息很清楚,但我找不到方法:
name = 'request'
def _lookup_req_object(name):
top = _request_ctx_stack.top
if top is None:
raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context. This typically means that you attempted
to use functionality that needed an active HTTP request.
Consult the documentation on testing for information about how to avoid this problem.
如果 handle_url 在没有任何输入值的情况下实现,它将正常工作,但需要从方法外接收请求对象属性。
有什么办法可以解决这个问题吗?
您可以在 process_data 方法之外使用全局请求对象,并将其属性传递给您的方法:
class ApiDetail():
base_url = request.base_url
view_args = request.view_args
def process_data(self, process_input, base_url, view_args):
try:
request_simple_url = self.handle_url(base_url, view_args)
return self.validate_input(request_simple_url, process_input)
except NotFoundException as e:
return {"error": str(e)}, HTTPStatus.UNAUTHORIZED
#implementation detail
@staticmethod
def handle_url(request_base_url, request_arguments):
#implementation detail
def test_process_data():
with mock.patch('ApiDetail.validate_input', return_value = NotFoundException):
with mock.patch('ApiDetail.handle_url', return_value='test_handled'):
assert ApiDetail.process_data(self=ApiDetail, process_input='test_input', base_url='test_url', view_args='test_args') == NotFoundException