How do I test dictionary-equality with Python's doctest-package?

邮差的信 提交于 2019-11-28 08:02:21
Claudiu

Doctest doesn't check __repr__ equality, per se, it just checks that the output is exactly the same. You have to ensure that whatever is printed will be the same for the same dictionary. You can do that with this one-liner:

>>> sorted(my_function().items())
[('a', 'dictionary'), ('this', 'is')]

Although this variation on your solution might be cleaner:

>>> my_function() == {'this': 'is', 'a': 'dictionary'}
True

Another good way is to use pprint (in the standard library).

>>> import pprint
>>> pprint.pprint({"second": 1, "first": 0})
{'first': 0, 'second': 1}

According to its source code, it's sorting dicts for you:

http://hg.python.org/cpython/file/2.7/Lib/pprint.py#l158

items = _sorted(object.items())

I ended up using this. Hacky, but it works.

>>> p = my_function()
>>> {'this': 'is', 'a': 'dictionary'} == p
True

turn it into a list via dict.items() and then sort it ...

>>> l = my_function().items()
>>> l.sort()
>>> l
[('a', 'dictionary'), ('this', 'is')]

You can create an instance of unittest.TestCase class inside your doctests, and use it to compare dictionaries:

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'}

Note: this approach is better than simply checking if dictionaries are equal, because it will show diff between the two dictionaries.

Most of it has been already said here.. anyway JSYK: there is a dedicated section in doctest documentation:

https://docs.python.org/3.5/library/doctest.html#warnings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!