단위 테스트에서 JSON으로 요청을 보내는 방법


96

요청에서 JSON을 사용하는 Flask 응용 프로그램 내에 코드가 있으며 다음과 같이 JSON 개체를 가져올 수 있습니다.

Request = request.get_json()

이것은 잘 작동했지만 Python의 unittest 모듈을 사용하여 단위 테스트를 만들려고 시도 중이며 요청과 함께 JSON을 보내는 방법을 찾는 데 어려움이 있습니다.

response=self.app.post('/test_function', 
                       data=json.dumps(dict(foo = 'bar')))

이것은 나에게 준다 :

>>> request.get_data()
'{"foo": "bar"}'
>>> request.get_json()
None

Flask에는 post 요청 내에서 json = dict (foo = 'bar') 설정할 수있는 JSON 인수가있는 것 같지만 unittest 모듈로이를 수행하는 방법을 모르겠습니다.


무엇을 request.data포함합니까? 종종 잘못된 입력으로 인해 json 구문 분석이 실패하면 자동으로 실패하고 반환 None되므로 원시 입력 데이터가 json이 아닐 수 있습니다.
Benoît Latinier 2015 년

>>> request.get_data () '{ "foo": "bar"}'>>> request.get_json () 없음 플라스크의 요청이 어떻게 작동하는지 잘 모르겠지만 데이터와 json을 분리하는 것 같습니다. 데이터가 아닌 json에 정보를 보내는 방법을 알아낼 수 없습니다.
Sepehr Nazari 2015

9
콘텐츠 유형 헤더라고 생각하므로 appliacation / json으로 설정하십시오. 또한 힘 매개 변수는 유용하지만 당신은 아마 거기 가서 그냥 unittests 더 마임을 변경, 통과하게하고 싶지 않아
user3012759

답변:


193

게시물을 다음으로 변경

response=self.app.post('/test_function', 
                       data=json.dumps(dict(foo='bar')),
                       content_type='application/json')

고쳤다.

user3012759에게 감사드립니다.


이것으로 내 머리를 뒤흔들고 있었다. 이미 application/json콘텐츠 유형을 지정하고 있는데 데이터를 덤프해야하는 이유를 이해하지 못합니다 .
dimmg

게시물로 보내는 모든 것이 문자열이어야하기 때문이라고 생각합니다.
Sepehr Nazari 2011

17
플라스크의 test_client에는 API 문서가 없기 때문에 이것이 문서에 없습니다!
rjurney

응답에서 데이터를 얻는 방법은 무엇입니까?
변수

@variable, .NET을 사용하여 데이터에 바이트로 액세스 할 수있는 post 것과 같은 요청 의 응답 resp = client.post('/my/endpoint/',json=my_json_data)이 있습니다 resp.data.
amiabl

44

업데이트 : Flask 1.0 릴리스 flask.testing.FlaskClient메서드는 json인수와 Response.get_json메서드 추가를 허용 하므로 예제를 참조하십시오 .

Flask 0.x의 경우 아래 영수증을 사용할 수 있습니다.

from flask import Flask, Response as BaseResponse, json
from flask.testing import FlaskClient
from werkzeug.utils import cached_property


class Response(BaseResponse):
    @cached_property
    def json(self):
        return json.loads(self.data)


class TestClient(FlaskClient):
    def open(self, *args, **kwargs):
        if 'json' in kwargs:
            kwargs['data'] = json.dumps(kwargs.pop('json'))
            kwargs['content_type'] = 'application/json'
        return super(TestClient, self).open(*args, **kwargs)


app = Flask(__name__)
app.response_class = Response
app.test_client_class = TestClient
app.testing = True

1
그리고 json 인수는 dictJSON 문자열 이 아니 어야한다는 것을 잊지 마십시오 !
LaundroMat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.