我正在写输出字典的功能的文档测试。 该文档测试看起来像
>>> my_function()
{'this': 'is', 'a': 'dictionary'}
当我运行它,它失败
Expected:
{'this': 'is', 'a': 'dictionary'}
Got:
{'a': 'dictionary', 'this': 'is'}
我最好的猜测,这种故障的原因是文档测试不检查字典的平等,而是__repr__
平等。 这篇文章表明,有一些方法来欺骗文档测试到检查字典平等。 我怎样才能做到这一点?
文档测试不检查__repr__
平等本身,它只是检查输出是完全一样的。 你必须确保无论是印刷将是相同的字典一样。 你可以做到这一点与此一行代码:
>>> sorted(my_function().items())
[('a', 'dictionary'), ('this', 'is')]
虽然您的解决方案这种变化可能是清洁剂:
>>> my_function() == {'this': 'is', 'a': 'dictionary'}
True
另一个好方法是使用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())
最后我用这个。 哈克,但它的作品。
>>> p = my_function()
>>> {'this': 'is', 'a': 'dictionary'} == p
True
把它变成通过dict.items()列表,然后排序呢?
>>> l = my_function().items()
>>> l.sort()
>>> l
[('a', 'dictionary'), ('this', 'is')]
您可以创建一个实例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'}
注意:这种方法比简单地检查,如果字典是平等的,因为它会显示两个库之间的差异比较好。
它的大部分已经被说这里..反正JSYK:有文档测试文档的专用部分:
https://docs.python.org/3.5/library/doctest.html#warnings