unittest unit test raises example assert_equal python dictionary doctest

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



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'')]