我正在使用Flask Restx构建API。我已经写了一个通用的异常处理程序,它将抛出一个错误消息和Json格式的代码。
@app.errorhandler(APIError)
def handle_invalid_usage(error):
logger.opt(exception=True).error(error)
response = jsonify(error.to_dict())
response.status_code = error.status_code
return response
我正在尝试使用pytest编写单元测试来测试错误条件(未找到资源)。我的单元测试只返回500内部服务器错误(response.status_code),而不是经过错误处理程序并返回404。当我直接使用Postman测试它时,它工作得很好。
@pytest.fixture(scope="session")
def app():
app = create_app()
return app
@pytest.fixture
def client(app):
return app.test_client()
def test_get_sequence_resource_not_found(mocker: MockerFixture, client: FlaskClient):
mocked = mocker.patch("service.ViewSequenceService.get_sequence")
mocked.side_effect = ResourceNotFound('Sequence id Not Present')
response = client.get("/sequence/f15a9f6e-7a1d-4d12-99c3-fb80d4bc98a1")
json_data = json.loads(response.data)
assert response.status_code == 404
assert json_data['payload']['message'] == 'Sequence id Not Present'
assert json_data['payload']['status'] == 404
我们遇到了同样的问题。似乎pytest要识别它的异常必须注册到API而不是应用程序。
from flask_restx import Api
class APIError(Exception):
status_code = 400
content = {"error": "Bad request"}
api = Api()
@api.errorhandler(APIError)
def handle_invalid_usage(exc: APIException):
return exc.content, exc.status_code