如何为Flask Post Unit Test Python

时间:2016-01-15 16:39:09

标签: python unit-testing post flask

所以在我的烧瓶应用程序中,我在前端有一个表单,其中包含多个用户。每个用户都与一个名为“selected_user”的复选框相关联。提交时,表单通过标准HTML表单控件发布(没有任何类型的javascript或手动ajax)。

在后端,我可以使用

解析它
flask.request.form.getlist('selected_user')

并返回我期望的用户列表(这里的用户本身就是唯一键和相关值的字典)。

打印出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\'}'...)])

我的问题是,我似乎无法在我的单元测试中复制这种格式。显然,我可以使用一些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)

这给我一个错误如下:

add_file() got an unexpected keyword argument 'primaryEmail'

我还尝试将这些作为查询字符串发送,将数据作为json.dumps(data)发送,将每个mock_user编码为这样的元组:

data = []
for x in range(0, 3):
  my_tuple = ('selected_user', mock_users[x])
  data.append(my_tuple)

这些方法都没有适用于其他各种错误。我在这里错过了什么?提前感谢您的帮助!另外,对不起,如果有明显的语法错误,我为SO重写了一些,而不是复制粘贴。

1 个答案:

答案 0 :(得分:5)

您可以创建一个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

打印:

ImmutableMultiDict([
    ('select_user', {'primaryEmail': 'a@a.com', 'name': {'fullName': 'a'}}),
    ('select_user', {'primaryEmail': 'b@b.com', 'name': {'fullName': 'b'}})
])

编辑:

data.add...应该是data.add('selected_user', json.dumps(mock_user)),因为您发布的输出看起来像是JSON编码的字符串。