2016-01-15 49 views
4

因此,在我的燒瓶應用程序中,我在前端有一個表單,該表單由多個用戶填充。每個用戶都與名爲'selected_user'的複選框關聯。提交時,表單通過標準HTML表單控件發佈(不包含任何類型的javascript或手動ajax)。如何在Flask Post單元測試中複製Multidict Python

在後臺,我可以用

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(數據),編碼每mock_user作爲這樣一個元組:

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

這些方法都不適用於其他各種錯誤。我在這裏錯過了什麼?提前感謝您的幫助!另外,對不起,如果有明顯的語法錯誤,我重寫了一些這樣的SO而不是複製粘貼。

回答

3

您可以創建一個MultiDict,然後使之永恆:

from werkzeug.datastructures import MultiDict, ImmutableMultiDict 

FAKE_EMAILS_AND_NAMES = [ 
    {'email': '[email protected]', 
    'name': 'a'}, 
    {'email': '[email protected]', 
    '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': '[email protected]', 'name': {'fullName': 'a'}}), 
    ('select_user', {'primaryEmail': '[email protected]', 'name': {'fullName': 'b'}}) 
]) 

編輯:

data.add...大概應該是data.add('selected_user', json.dumps(mock_user)),因爲它看起來像你發佈的輸出是一個JSON編碼的字符串。

+0

你真正的MVP!首先嚐試使用您建議的json.dumps部分。也感謝進口。我有一個可怕的經歷,試圖找到燒瓶的各種包裝的文件,這樣爲我節省了更多的時間。謝謝! – eholder0