2017-02-13 6 views
1

Как один модуль может тестировать конечную точку REST API, написанную в колбе, которая принимает вложенный объект словаря для тела запроса?Единичные тесты с вложенными объектами в запросе с использованием фляжки

Ниже приведен пример с использованием колбы и webargs для проверки входных данных,

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

, который работает правильно при использовании этого enpoint непосредственно,

% 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 и webargs 1.5.2.

также представил вопрос на https://github.com/pallets/flask/issues/2176

ответ

0

Оказывается, что, несмотря на использовании webargs, входные данные должны еще быть сериализованными и CONTENT_TYPE явно указаны для этой работы. В частности, замена

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

с

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

фиксированной эту проблему (смотри также связанные ТАК отвечает here).

Смежные вопросы