使用Flask对请求中的嵌套对象进行单元测试

th

一个单元如何测试用Flask编写的REST API终结点,该终结点接受请求主体的嵌套字典对象?

这是一个使用flask和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()

直接使用此指定点时可以正常工作,

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

它使用Python 3.5,flask 0.12和webargs 1.5.2。

还通过https://github.com/pallets/flask/issues/2176提交了问题

th

看起来,尽管使用了webargs,输入数据仍必须进行序列化并显式指定content_type,才能使此函数起作用。特别是替换

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

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

解决了这个问题(另请参见此处的相关SO答案)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Spring Security进行单元测试

如何在Django单元测试中获取请求对象?

如何在Django单元测试中获取请求对象?

使用PanicsWithValue进行Golang单元测试

在Angular 2中对可观察对象进行单元测试

如何在iOS 7.1中使用NSURLSession对HTTP请求和响应进行单元测试?

使用StaticLoggerBinder对类进行单元测试

使用Automake进行单元测试

对使用RTOS的项目进行单元测试

Django使用ForeignKey进行单元测试

使用GORM函数对域对象进行单元测试

使用Mockito进行的JVM单元测试,用于测试Retrofit2和RxJava的网络请求

使用Python进行单元测试中的依赖注入

使用Mockito进行Runnable的单元测试

使用ObjectBox进行单元测试

对使用HttpClient发出Http请求的Controller进行单元测试

使用GitLab CI进行单元测试

如何在RxJava 2中使用TestObserver对对象列表进行单元测试?

在Flask中,如何对WTF表单进行单元测试?

使用文件中的数据进行单元测试

使用Hooks在React中对Apollo Graphql进行单元测试

如何在Angular 8中使用对象模拟数组数据以进行单元测试

在 Flask 单元测试中获得 400

使用 MockEndPointsandSkip 进行 Camel 单元测试

使用 jasmine 进行单元测试时模拟全局对象

使用 createSpyObj 对 observable 进行单元测试

使用 sinon 在包装器中调用对象时如何进行单元测试?

如何使用 Spring MVC 测试对多部分 POST 请求进行单元测试?

如何使用 jasmine-karna 对 angular 中的嵌套函数进行单元测试