2015-09-22 4 views
5

Ich habe alle Methoden aus meinem Flashin-Restful-API-Modul getestet. Jetzt möchte ich die get-Methode testen, indem ich den API-Aufruf tatsächlich mache. Ich erwarte Fehler 400 von diesem Test.500 INTERNER SERVER-FEHLER beim Testen eines (flaschen-erholsamen) GET API-Aufrufs erhalten

Meine Ressourcenklasse

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) 

Mein 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) 

versagt Mein Test, weil die Antwort, die ich Fehler

AssertionError: 500 != 400 

Stac 500 erhalten 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 

Durch einen Debug-Punkt in get Methode setzen, sehe ich, dass die Ausführung bis abort(400, message=mistake) geht.

Was ist dann los? Warum schlägt mein Test fehl?

+0

Ich bin kein Flask-Experte, aber AFAIK verwenden Sie eine falsche 'abort()' -Syntax. Wenn Sie 'resp' Inhalte drucken, finden Sie möglicherweise einen' TypeError', der eingeloggt ist. Schauen Sie sich http://StackOverflow.com/a/21301229/4101725 an, wenn Sie wissen wollen, wie man es benutzt. Aber der erste Schuss könnte nur 'abort (400)' oder 'abort (404)' sein. Wie auch immer, Sie sollten glücklich sein: Ihr Test hat einen heimtückischen Fehler im Fehlerhandler gefunden :) –

+0

... nur noch eine Sache ... Lassen Sie mich wissen, wenn es funktioniert, dass ich eine Antwort einreichen werde. –

+0

Hey. Sie haben Recht! Es gibt kein Problem in der Syntax von Abbruch, Es ist, was ich ihm übergeben habe. Die "Nachricht" kwarg, die ich an "abort" übergebe, sollte eine Zeichenkette sein. Also habe ich es in 'abort (404, message = err.message)' geändert. Ich muss das im Hinterkopf behalten. Danke für die Hilfe. – Hussain

Antwort

3

Für die ganze Zeit nahm ich an, dass das Problem mit meinem Komponententest war. Ich habe mich geirrt!

Das Problem war in meinem Code. Und wie Michele sagte, hat mein Test es gefunden.

Die message kwarg in abort Methode wird erwartet, um eine Zeichenfolge zu sein, und ich übergab es stattdessen das Ausnahmeobjekt. So bekam ich eine Ausnahme auf der abort Linie. So

korrigierte ich es

abort(400, message=mistake.message) 

Alternativ ich auch

schreiben
abort(400, message=str(mistake)) 

Jetzt ist mein Test vorbei ist.

Verwandte Themen