2017-02-13 1 views
1

要求本体のネストされたディクショナリオブジェクトを受け入れるフラスコに書かれたREST APIエンドポイントを、単体テストでテストする方法はありますか?ここフラスコを使用したリクエストでネストされたオブジェクトを使用した単体テスト

は、入力検証、直接enpointを使用するときに正常に動作

from flask import Flask 
from webargs import fields 
from webargs.flaskparser import use_args 

app = Flask(__name__) 

hello_args = { 
    'a': fields.Nested({'name' : fields.Str()}) 
} 

@app.route('/', methods=['POST']) 
@use_args(hello_args) 
def index(args): 
    return 'Hello ' + str(args) 


def test_app(): 
    app.config['TESTING'] = True 
    test_app = app.test_client(use_cookies=False) 
    test_app.post(data={"a": {"name": "Alice"}}) 


if __name__ == '__main__': 
    app.run() 

ためフラスコwebargsを用いた例であり、それは内部呼び出されたときに、

% curl -H "Content-Type: application/json" -X POST \ 
     -d '{"a":{"name": "Alice"}}' http://localhost:5000 

Hello {'a': {'name': 'Alice'}}% 

しかしwerkzeug.test.EnvironBuilderに例外が発生しますユニットテスト、

nosetests /tmp/test.py              
E 
====================================================================== 
ERROR: test.test_app 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/usr/lib64/python3.4/site-packages/nose/case.py", line 198, in runTest 
    self.test(*self.arg) 
    File "/tmp/test.py", line 26, in test_app 
    test_app.post(data={"a": {"name": "Alice"}}) 
    File "/home/rth/.local/lib64/python3.4/site-packages/werkzeug/test.py", line 788, in post 
    return self.open(*args, **kw) 
    File "/home/rth/.local/lib64/python3.4/site-packages/flask/testing.py", line 103, in open 
    builder = make_test_environ_builder(self.application, *args, **kwargs) 
    File "/home/rth/.local/lib64/python3.4/site-packages/flask/testing.py", line 34, in make_test_environ_builder 
    return EnvironBuilder(path, base_url, *args, **kwargs) 
    File "/home/rth/.local/lib64/python3.4/site-packages/werkzeug/test.py", line 338, in __init__ 
    self._add_file_from_data(key, value) 
    File "/home/rth/.local/lib64/python3.4/site-packages/werkzeug/test.py", line 355, in _add_file_from_data 
    self.files.add_file(key, **value) 
TypeError: add_file() got multiple values for argument 'name' 

---------------------------------------------------------------------- 
Ran 1 test in 0.011s 

FAILED (errors=1) 

これは、Pytho n 3.5、フラスコ0.12およびウェブ1.5.2。

はまた、webargsの使用にもかかわらず、入力データがまだ直列化されなければならない、これが機能するためにCONTENT_TYPEが明示的に指定することを思わhttps://github.com/pallets/flask/issues/2176

答えて

0

で問題を提出しました。特に、

test_app.post(data=json.dumps({"a": {"name": "Alice"}}), 
      content_type='application/json') 

test_app.post(data={"a": {"name": "Alice"}}) 

を交換する(参照も関連SO hereに回答)この問題を修正しました。

関連する問題