我正在为输出字典的函数编写doctest。 doctest看起来像
>>> my_function()
{'this': 'is', 'a': 'dictionary'}
当我运行它时,
失败Expected:
{'this': 'is', 'a': 'dictionary'}
Got:
{'a': 'dictionary', 'this': 'is'}
我对这次失败原因的最好猜测是doctest不是检查字典相等,而是__repr__
相等。 This post表示有一些方法可以欺骗doctest检查字典相等性。我怎么能这样做?
答案 0 :(得分:39)
另一个好方法是使用pprint
(在标准库中)。
>>> import pprint
>>> pprint.pprint({"second": 1, "first": 0})
{'first': 0, 'second': 1}
根据其源代码,它为您排序:
http://hg.python.org/cpython/file/2.7/Lib/pprint.py#l158
items = _sorted(object.items())
答案 1 :(得分:22)
Doctest不会检查__repr__
相等性,它本身只会检查输出是否完全相同。您必须确保打印的内容与同一字典的内容相同。你可以用这个单行代码来做到这一点:
>>> sorted(my_function().items())
[('a', 'dictionary'), ('this', 'is')]
虽然您的解决方案的这种变化可能更清晰:
>>> my_function() == {'this': 'is', 'a': 'dictionary'}
True
答案 2 :(得分:13)
我最终使用了这个。 Hacky,但它确实有效。
>>> p = my_function()
>>> {'this': 'is', 'a': 'dictionary'} == p
True
答案 3 :(得分:2)
通过dict.items()将其转换为列表,然后对其进行排序......
>>> l = my_function().items()
>>> l.sort()
>>> l
[('a', 'dictionary'), ('this', 'is')]
答案 4 :(得分:1)
您可以在doctests中创建unittest.TestCase
类的实例,并使用它来比较词典:
def my_function(x):
"""
>>> from unittest import TestCase
>>> t = TestCase()
>>> t.assertDictEqual(
... my_function('a'),
... {'this': 'is', 'a': 'dictionary'}
... )
>>> t.assertDictEqual(
... my_function('b'),
... {'this': 'is', 'b': 'dictionary'}
... )
"""
return {'this': 'is', x: 'dictionary'}
注意:这种方法比简单地检查词典是否相等更好,因为它会显示两个词典之间的差异。
答案 5 :(得分:1)
大部分内容已在此处说过..无论如何JSYK:doctest文档中有专门的部分:
答案 6 :(得分:0)
我发现测试任意嵌套的数据时,在doctest中使用deepdiff包很有用。例如:
def something_complicated():
"""
>>> from deepdiff import DeepDiff
>>> DeepDiff(something_complicated(),
... {'expected': {'output': ['a', 'b', 'c']}},
... ignore_order=True)
{}
"""
items = ['a', 'b', 'c']
random.shuffle(items)
return {'expected': {'output': items}}