使用urllib.parse.urlencode测试函数时输出变化

时间:2014-11-21 19:37:37

标签: unit-testing python-3.x mocking

我正在尝试下面的功能

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 个答案:

答案 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'),
])