2015-09-22 18 views
5

Ho rimosso tutti i metodi dal modulo API restful del flask. Ora voglio testare il metodo get effettuando effettivamente la chiamata API. Mi aspetto l'errore 400 da questo test.Ottenere 500 ERRORE INTERNO SERVER quando si interrompe una chiamata API GET (restitutile) API

La mia classe di risorse

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) 

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

Il mio test non è riuscito perché la risposta che ottengo è errore 500

AssertionError: 500 != 400 

Stac 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 

Mettendo un punto di debug in get metodo, vedo che l'esecuzione va fino abort(400, message=mistake).

Quindi cosa sta succedendo? Perché il mio test fallisce?

+0

Non sono un esperto di Flask ma AFAIK si usa una sintassi 'abort()' errata. Se stampi il contenuto di 'resp' forse troverai un' TypeError' loggato. Dai uno sguardo a http://stackoverflow.com/a/21301229/4101725 se vuoi sapere come usarlo. Ma il primo colpo potrebbe essere usato solo 'abort (400)' o 'abort (404)'. Ad ogni modo dovresti essere felice: il tuo test ha trovato un bug insidioso nel gestore degli errori :) –

+0

... solo un'altra cosa ... fammi sapere se funziona che presenterò una risposta. –

+0

Ehi. Hai ragione! Non c'è alcun problema nella sintassi di abortire, è ciò che stavo passando ad esso. Il kwarg 'message' che passo a' abort' dovrebbe essere una stringa. Quindi l'ho cambiato in 'abort (404, message = err.message)'. Ho bisogno di tenerlo a mente. Grazie per l'aiuto. – Hussain

risposta

3

Per tutto il tempo ho pensato che il problema fosse con il mio test unitario. Mi sbagliavo!

Il problema era nel mio codice. E come ha detto Michele, il mio test l'ha trovato.

Il message kwarg nel metodo abort deve essere una stringa e invece l'ho passato come oggetto di eccezione. Quindi ricevevo un'eccezione sulla linea abort.

Così ho corretto che

abort(400, message=mistake.message) 

In alternativa posso anche scrivere

abort(400, message=str(mistake)) 

Ora il mio test sta passando.