我正在尝试下面的功能
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
在错误中,您可以看到参数列表中的元素是交换的。任何人都可以告诉我如何阻止他们交换或有任何其他方法来测试这种类型的功能。
由于
答案 0 :(得分: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'),
])