フラスコに頼りになるAPIモジュールからすべてのメソッドをユニット化しました。今私は実際にAPI呼び出しを行うことによってメソッドを取得するテストします。私はこのテストからエラー400を期待しています。(フラスコに寛容な)GET APIコールをユニットテストするときに500の内部サーバーエラーを取得する
マイリソースクラス
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)
私のunittestの
# 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
AssertionError: 500 != 400
のStacあるので、私のテストが失敗しましたget
方法でデバッグポイントを入れてたktrace
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
は、私が実行がabort(400, message=mistake)
まで行くことがわかります。
次に何が起こっていますか?なぜ私のテストは失敗するのですか?
私はFlaskのエキスパートではありませんが、AFAIKでは間違った 'abort()'構文を使用しています。 'resp'の内容を印刷すると、' TypeError'がログインしている可能性があります。使い方を知りたいのであれば、http://stackoverflow.com/a/21301229/4101725を見てください。しかし、最初のショットは、単に '中断(400)'または '中止(404)'を使うことができます。とにかくあなたは幸せでなければなりません:あなたのテストでは、エラーハンドラに潜む狡猾なバグが見つかりました:) –
...ちょうどもう1つ...私が答えを提出することができたら私に教えてください。 –
ねえ。あなたが正しいです!アボートの構文には問題はありません。それが私に渡しています。私が 'abort'に渡す' message' kwargは文字列でなければなりません。だから私は 'abort(404、message = err.message)'に変更しました。私はこれを念頭に置いておく必要があります。助けてくれてありがとう。 – Hussain