unit - ¿Cómo pruebo la igualdad del diccionario con el paquete doctest de Python?
unit test en python (6)
Estoy escribiendo un doctest para una función que genera un diccionario. El doctest parece
>>> my_function()
{''this'': ''is'', ''a'': ''dictionary''}
Cuando lo ejecuto, falla con
Expected:
{''this'': ''is'', ''a'': ''dictionary''}
Got:
{''a'': ''dictionary'', ''this'': ''is''}
Mi mejor conjetura en cuanto a la causa de este error es que doctest no está verificando la igualdad del diccionario, sino __repr__
igualdad. Esta publicación indica que hay alguna forma de engañar a doctest para que verifique la igualdad del diccionario. ¿Cómo puedo hacer esto?
Doctest no comprueba __repr__
equality, per se, simplemente comprueba que el resultado sea exactamente el mismo. Debe asegurarse de que todo lo que se imprima sea igual para el mismo diccionario. Puedes hacer eso con este one-liner:
>>> sorted(my_function().items())
[(''a'', ''dictionary''), (''this'', ''is'')]
Aunque esta variación en su solución puede ser más clara:
>>> my_function() == {''this'': ''is'', ''a'': ''dictionary''}
True
La mayor parte ya se ha dicho aquí ... de todos modos JSYK: hay una sección dedicada en la documentación más doctest:
Otra buena forma es usar pprint
(en la biblioteca estándar).
>>> import pprint
>>> pprint.pprint({"second": 1, "first": 0})
{''first'': 0, ''second'': 1}
De acuerdo con su código fuente, está ordenando dicts para usted:
http://hg.python.org/cpython/file/2.7/Lib/pprint.py#l158
items = _sorted(object.items())
Puede crear una instancia de unittest.TestCase
class dentro de sus doctests, y usarlo para comparar diccionarios:
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''}
Nota: este enfoque es mejor que simplemente verificar si los diccionarios son iguales, ya que mostrará diferencias entre los dos diccionarios.
Terminé usando esto. Hacky, pero funciona.
>>> p = my_function()
>>> {''this'': ''is'', ''a'': ''dictionary''} == p
True
convertirlo en una lista a través de dict.items () y luego ordenarlo ...
>>> l = my_function().items()
>>> l.sort()
>>> l
[(''a'', ''dictionary''), (''this'', ''is'')]