【问题标题】:Getting 500 INTERNAL SERVER ERROR when unittesting a (flask-restful) GET API Call单元测试(flask-restful)GET API 调用时出现 500 INTERNAL SERVER ERROR
【发布时间】:2015-09-22 07:29:30
【问题描述】:

我已经对我的 flask-restful API 模块中的所有方法进行了单元测试。现在我想通过实际调用 API 来测试 get 方法。我预计此测试会出现错误 400。

我的资源类

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

AssertionError: 500 != 400

堆栈跟踪

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)

那到底是怎么回事?为什么我的测试失败了?

【问题讨论】:

  • 我不是 Flask 专家,但 AFAIK 你使用了错误的 abort() 语法。如果您打印resp 内容,您可能会发现TypeError 已登录。如果您想知道如何使用它,请查看stackoverflow.com/a/21301229/4101725。但是第一个镜头可以只使用abort(400)abort(404)。无论如何,您应该感到高兴:您的测试在错误处理程序中发现了一个阴险的错误 :)
  • ...还有一件事...让我知道它是否有效,我会提交答案。
  • 嘿。你说的对! abort 的语法没有问题,这是我传递给它的。我传递给abortmessage kwarg 应该是一个字符串。所以我把它改成了abort(404, message=err.message)。我需要记住这一点。感谢您的帮助。
  • 好的,有人应该写一个答案:我们不能在 cmets 中留下答案。你写还是我应该写?
  • 好的。我会写的。

标签: python unit-testing mocking flask-restful


【解决方案1】:

我一直认为问题出在我的单元测试上。我错了!

问题出在我的代码中。正如米歇尔所说,我的测试已经找到了。

abort 方法中的 message kwarg 应为字符串,而我将其传递给异常对象。所以我在abort 行遇到了异常。

所以我更正了它

abort(400, message=mistake.message)

或者我也可以写

abort(400, message=str(mistake))

现在我的测试通过了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 2023-03-30
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多