簡體   English   中英

如何為Flask Post單元測試Python復制Multidict

[英]How to Replicate Multidict for Flask Post Unit Test Python

因此,在我的燒瓶應用程序中,前端有一個表單,其中填充了多個用戶。 每個用戶都與一個名為“ 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)發送數據,將每個模擬用戶編碼為元組,如下所示:

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

這些方法都無法解決其他各種錯誤。 我在這里想念什么? 提前感謝您的幫助! 另外,如果有明顯的語法錯誤,請您諒解,因為我將其中一些重寫為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

打印:

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編碼的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM