2015-09-22 33 views
5

Mam niekontrolowane wszystkie metody z mojego modułu API spłukiwania kolb. Teraz chcę przetestować metodę get, wykonując wywołanie API. Spodziewam się błędu 400 z tego testu.Uzyskiwanie 500 BŁĘDU SERWERA WEWNĘTRZNEGO w przypadku unieważniania (GET API) wywołania interfejsu API:

Moja klasa zasób

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) 

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

Mój test nie powiedzie się, ponieważ reakcja uzyskać jest błąd 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 

Poprzez umieszczenie punktu debugowania w get metody, widzę, że wykonanie idzie do abort(400, message=mistake).

Co się dzieje? Dlaczego mój test kończy się niepowodzeniem?

+0

Nie jestem ekspertem od Flask, ale AFAIK, używasz niewłaściwej składni "abort()". Jeśli wydrukujesz zawartość "resp", może znajdziesz "TypeError" zalogowany. Zajrzyj do http://stackoverflow.com/a/21301229/4101725, jeśli chcesz się dowiedzieć, jak go użyć. Ale pierwszy strzał może być użyty po prostu 'abort (400)' lub 'abort (404)'. W każdym razie powinieneś być szczęśliwy: twój test znalazł podstępny błąd w obsłudze błędu :) –

+0

... jeszcze jedna rzecz ... Daj mi znać, czy to działa, że ​​złożę odpowiedź. –

+0

Hej. Masz rację! W składni przerwania nie ma problemu, właśnie to przekazywałem. 'Message' kwarg, które przechodzę do' abort' powinno być ciągiem znaków. Więc zmieniłem go na 'abort (404, message = err.message)'. Muszę o tym pamiętać. Dzięki za pomoc. – Hussain

Odpowiedz

3

Przez cały czas zakładałem, że problem dotyczył testu mojego urządzenia. Myliłem się!

Problem był w moim kodzie. I jak Michele powiedziała, że ​​mój test go znalazł.

Metodą message kwarg w abort oczekuje się, że będzie to ciąg znaków, a zamiast tego przekazałem mu obiekt wyjątku. Otrzymałem wyjątek od linii abort.

więc poprawiłem to

abort(400, message=mistake.message) 

Ewentualnie mogę też pisać

abort(400, message=str(mistake)) 

Teraz moje testy przechodzi.