2014-11-21 60 views
0

我試圖以下功能變化的輸出,同時用urllib.parse.urlencode

def get(id, uri): 
    resource_uri = '{uri}projects/{id}/meta'.format(
     uri=uri, 
     id=id) 
    uri_parameters_list = { 
     'PropertyTypes': 'true', 
     'RichTextAsPlain': 'true' } 
    request_uri = '{uri}?{parameters}'.format(
     uri=resource_uri, 
     parameters=urllib.parse.urlencode(uri_parameters_list)) 

    return request_uri 

以下測試來測試功能是測試代碼

def test_prep_get_metadata(self): 
    request_uri = "http://api/projects/3/meta?PropertyTypes=true&RichTextAsPlain=true" 
    self.assertEqual(get(self.id,self.uri),request_uri) 

當我運行上述測試代碼它完美地運行有時有時它會拋出Assertion錯誤,說

錯誤:

http://api/projects/3/meta?RichTextAsPlain=true&PropertyTypes=true!=http://api/projects/3/meta? PropertyTypes=true&RichTextAsPlain=true 

在錯誤中您可以看到參數列表中的元素已交換。任何人都可以告訴我如何阻止他們交換,或者有任何其他方式來測試這種類型的功能。

感謝

回答

1

你調用urllib.parse.urlencode(uri_parameters_list)與字典uri_parameters_list和字典的順序沒有確定。它可以從一個Python運行到下一個,因爲這些元素沒有排序(當然,它們是內部的,但順序可能會有所不同)。

因此,您需要在將字典傳遞到urllib.parse.urlencode之前訂購字典。在這種情況下最好使用collections.OrderedDict

import collections 

uri_parameters_list = collections.OrderedDict([ 
    ('PropertyTypes', 'true'), 
    ('RichTextAsPlain', 'true'), 
]) 
+0

謝謝。有效 – Ksc 2014-11-21 20:55:37