eho*_*er0 5 python post unit-testing flask
因此,在我的烧瓶应用程序中,前端有一个表单,其中填充了多个用户。每个用户都与一个名为“ selected_user”的复选框相关联。提交后,该表单将通过标准HTML表单控件发布(不得使用任何javascript或手动ajax)。
在后端,我可以使用
flask.request.form.getlist('selected_user')
Run Code Online (Sandbox Code Playgroud)
并返回我期望的用户列表(这里的用户本身就是唯一键和关联值的字典)。
打印出flask.request.form如下所示:
ImmutableMultiDict([
('_xsrf_token', u'an_xsrf_token_would_go_here'),
('selected_user', u'{u\'primaryEmail\': u\'some_value\'}'...),
('selected_user', u'{u\'primaryEmail\': u\'some_value\'}'...)])
Run Code Online (Sandbox Code Playgroud)
我的问题是,我似乎无法终生在单元测试中复制这种格式。显然,我可以使用一些javascript将前端的已检查用户捆绑到一个数组中或其他任何东西,然后在后端上更容易地复制该区域,这很可能是我最终要做的事情,但这似乎是不必要的麻烦只是为了使该功能在我的应用程序中表现良好时就可以对其进行测试。
这是我目前在测试中尝试过的内容,似乎应该是正确的答案,但它不起作用:
mock_users = []
for x in range(0, len(FAKE_EMAILS_AND_NAMES)):
mock_user = {}
mock_user['primaryEmail'] = FAKE_EMAILS_AND_NAMES[x]['email']
mock_user['name'] = {}
mock_user['name']['fullName'] = FAKE_EMAILS_AND_NAMES[x]['name']
mock_users.append(mock_user)
data = {}
data['selected_user'] = mock_users
response = self.client.post(flask.url_for('add_user'), data=data,
follow_redirects=False)
Run Code Online (Sandbox Code Playgroud)
这给我一个错误,如下所示:
add_file() got an unexpected keyword argument 'primaryEmail'
Run Code Online (Sandbox Code Playgroud)
我还尝试将这些作为查询字符串发送,作为json.dumps(data)发送数据,将每个模拟用户编码为元组,如下所示:
data = []
for x in range(0, 3):
my_tuple = ('selected_user', mock_users[x])
data.append(my_tuple)
Run Code Online (Sandbox Code Playgroud)
这些方法都无法解决其他各种错误。我在这里想念什么?提前感谢您的帮助!另外,如果有明显的语法错误,请您谅解,因为我将其中一些重写为SO,而不是复制粘贴。
您可以创建一个MultiDict,然后将其设置为不可变的:
from werkzeug.datastructures import MultiDict, ImmutableMultiDict
FAKE_EMAILS_AND_NAMES = [
{'email': 'a@a.com',
'name': 'a'},
{'email': 'b@b.com',
'name': 'b'},
]
data = MultiDict()
for x in range(0, len(FAKE_EMAILS_AND_NAMES)):
mock_user = {}
mock_user['primaryEmail'] = FAKE_EMAILS_AND_NAMES[x]['email']
mock_user['name'] = {}
mock_user['name']['fullName'] = FAKE_EMAILS_AND_NAMES[x]['name']
data.add('select_user', mock_user)
data = ImmutableMultiDict(data)
print data
Run Code Online (Sandbox Code Playgroud)
打印:
ImmutableMultiDict([
('select_user', {'primaryEmail': 'a@a.com', 'name': {'fullName': 'a'}}),
('select_user', {'primaryEmail': 'b@b.com', 'name': {'fullName': 'b'}})
])
Run Code Online (Sandbox Code Playgroud)
编辑:
该行data.add...可能应该是data.add('selected_user', json.dumps(mock_user))因为它看起来像您发布的输出是JSON编码的字符串。
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |