Testing dictionary results with doctest

MRAB google at mrabarnett.plus.com
Fri Oct 31 16:30:34 CET 2008


On Oct 31, 2:43 pm, Joe Strout <j... at strout.net> wrote:
> I love doctest -- the way it combines documentation with verification  
> seems elegant and useful, and most of the time it's simple and easy to  
> use.
>
> But I've run into a bit of a snag trying to test a method that returns  
> a dictionary, because (of course) the order in which the dictionary  
> pairs are printed may not match what I wrote as the expected result.  
> For example, my doctest string is:
>
>         """
>         >>> t = Template("The $object in $location falls mainly on the  
> $subloc.")
>         >>> t.match( "The rain in Spain falls mainly on the train." )
>         {'object': 'rain', 'location': 'Spain', 'subloc': 'train'}
>         """
>
> But when I run it, I get:
>
> > Failed example:
> >     t.match( "The rain in Spain falls mainly on the train." )
> > Expected:
> >     {'object': 'rain', 'location': 'Spain', 'subloc': 'train'}
> > Got:
> >     {'subloc': 'train', 'object': 'rain', 'location': 'Spain'}
>
> Now, you and I can see that the obtained results really do match the  
> expected results, considered as a dictionary rather than as a string.  
> But doctest doesn't see it that way.
>
> What's the standard solution for this?  Should I iterate over the  
> sorted keys and print those out instead?  Is there some built-in  
> method somewhere that will print a dictionary in a reliable order?  
> Does doctest have some special way to tell it to consider the result  
> as a dictionary rather than a string?  Or something else?
>
How about:

"""
>>> t = Template("The $object in $location falls mainly on the $subloc.")
>>> sorted(t.match( "The rain in Spain falls mainly on the train." ).items())
[('location', 'Spain'), ('object', 'rain'), ('subloc', 'train')]
"""



More information about the Python-list mailing list