单元测试(烧瓶静止的)GET API调用时出现500 INTERNAL SERVER ERROR [英] Getting 500 INTERNAL SERVER ERROR when unittesting a (flask-restful) GET API Call
问题描述
我已经对我的烧瓶式API模块的所有方法进行了单元测试.现在,我想通过实际进行API调用来测试get方法.我预计此测试会出现错误400.
I have unittested all the methods from my flask-restful API module. Now I want to test get method by actually making the API call. I expect error 400 from this test.
我的资源类别
class Response(Resource):
@marshal_with(response_params_get_responses_on_job)
def get(self, filter_name=None):
try:
response = self.process_get_request(filter_name)
if not response['users']:
raise MyValidationError("No data found")
return response
except MyValidationError as err:
abort(404, message=err)
except ValueError as mistake:
abort(400, message=mistake)
我的单元测试
# TODO - Failing!
@mock.patch('application.resources.response.Response.process_get_request', autospec=True)
def test_get_400(self, process_get_request_mock):
process_get_request_mock.side_effect = ValueError("some error")
app = Flask(__name__)
app.debug = True
api = Api(app, prefix='/api/v2')
api.add_resource(Response, '/user/responses', endpoint='job_responses')
api.init_app(app)
with app.test_client() as client:
resp = client.get('/api/v2/user/responses',
environ_base={'HTTP_USER_AGENT': 'Chrome'},
headers={'Content-type': 'application/json'})
self.assertEqual(resp.status_code, 400)
我的测试失败,因为我得到的响应是错误500
My test fails because the response I get is error 500
AssertionError: 500 != 400
Stacktrace
Failure
Traceback (most recent call last):
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/mock.py", line 1201, in patched
return func(*args, **keywargs)
File "/home/hussain/workspace/my-app/tests/unittests/test_Response.py", line 38, in test_get_400
headers={'Content-type': 'application/json'})
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/werkzeug/test.py", line 774, in get
return self.open(*args, **kw)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask/testing.py", line 108, in open
follow_redirects=follow_redirects)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/werkzeug/test.py", line 742, in open
response = self.run_wsgi_app(environ, buffered=buffered)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/werkzeug/test.py", line 659, in run_wsgi_app
rv = run_wsgi_app(self.application, environ, buffered=buffered)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/werkzeug/test.py", line 867, in run_wsgi_app
app_rv = app(environ, start_response)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask_cors/extension.py", line 110, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask_restful/__init__.py", line 270, in error_router
return original_handler(e)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask_restful/__init__.py", line 270, in error_router
return original_handler(e)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask_restful/__init__.py", line 267, in error_router
return self.handle_error(e)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask_restful/__init__.py", line 267, in error_router
return self.handle_error(e)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask_cors/extension.py", line 110, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask_restful/__init__.py", line 270, in error_router
return original_handler(e)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask_restful/__init__.py", line 270, in error_router
return original_handler(e)
File "/home/hussain/workspace/venv/local/lib/python2.7/site-packages/flask/app.py", line 1363, in handle_user_exception
assert exc_value is e
AssertionError
通过在get
方法中放置调试点,我看到执行一直执行到abort(400, message=mistake)
.
By putting a debug point in get
method, I see that the execution goes till abort(400, message=mistake)
.
那是怎么回事?为什么我的测试失败?
Then what is going on? Why does my test fail?
推荐答案
一直以来,我一直认为问题出在我的单元测试上.我错了!
For all the time I assumed the issue was with my unit test. I was wrong!
问题出在我的代码中.正如Michele所说,我的测试已经找到了.
The issue was in my code. And as Michele said my test has found it.
abort
方法中的message
kwarg应该是一个字符串,相反,我向它传递了异常对象.所以我在abort
行上遇到了异常.
The message
kwarg in abort
method is expected to be a string, and instead I was passing it the exception object. So I was getting an exception on the abort
line.
所以我纠正了
abort(400, message=mistake.message)
或者我也可以写
abort(400, message=str(mistake))
现在我的考试通过了.
这篇关于单元测试(烧瓶静止的)GET API调用时出现500 INTERNAL SERVER ERROR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!