I'm writing a doctest for a function that outputs a dictionary. The doctest looks like
>>> my_function()
{'this': 'is', 'a': 'dictionary'}
When I run it, it fails with
Expected:
{'this': 'is', 'a': 'dictionary'}
Got:
{'a': 'dictionary', 'this': 'is'}
My best guess as to the cause of this failure is that doctest isn't checking dictionary equality, but __repr__
equality. This post indicates that there's some way to trick doctest into checking dictionary equality. How can I do this?
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:Although this variation on your solution might be cleaner:
turn it into a list via dict.items() and then sort it ...
You can create an instance of
unittest.TestCase
class inside your doctests, and use it to compare dictionaries:Note: this approach is better than simply checking if dictionaries are equal, because it will show diff between the two dictionaries.
Another good way is to use
pprint
(in the standard library).According to its source code, it's sorting dicts for you:
http://hg.python.org/cpython/file/2.7/Lib/pprint.py#l158
I ended up using this. Hacky, but it works.
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