Comment atteindre assertDictEqual avec assertSequenceEqual appliquée à des valeurs

Je sais que, lors de l'exécution de assertEqual sur un dictionnaire, assertDictEqual est appelé. De même, assertEqual sur une séquence d'effectuer assertSequenceEqual.

Toutefois, lorsque assertDictEqual est de comparer les valeurs, il semble ne pas faire usage de assertEqual, et donc assertSequenceEqual n'est pas appelé.

Envisager de simples dictionnaires:

lst1 = [1, 2]
lst2 = [2, 1]

d1 = {'key': lst1}
d2 = {'key': lst2}

self.assertEqual(lst1, lst2) # True
self.assertEqual(d1, d2) # False ><

Comment puis-je tester les dictionnaires tels que d1 et d2 tels que l'égalité est bien comparé, en appliquant récursivement assertEqual-comme la sémantique des valeurs?

Je veux éviter d'utiliser des modules externes (comme l'a suggéré dans cette question) si possible, sauf si elles sont natives de django extensions.


MODIFIER

Essentiellement, ce que je suis après est intégré dans la version de ce:

def assertDictEqualUnorderedValues(self, d1, d2):
    for k,v1 in d1.iteritems():
        if k not in d2:
            self.fail('Key %s missing in %s'%(k, d2))

        v2 = d2[k]

        if isinstance(v1, Collections.iterable) and not isinstance(v1, basestring):
            self.assertValuesEqual(v1, v2)
        else:
            self.assertEqual(v1, v2)

Le problème avec le code ci-dessus est que les messages d'erreur ne sont pas aussi beau que l'builtin affirme, et il y a probablement des cas limites, j'ai ignoré (comme je l'ai juste écrit que sur le dessus de ma tête).

  • Avec le unittest module, self.assertEqual(lst1, lst2) n'est pas Vrai --> AssertionError: Lists differ: [1, 2] != [2, 1].
  • mon erreur, j'ai mal lu la partie de la documentation. Je suis à la recherche d'un équivalent de assertItemsEqual plutôt que assertSequenceEqual
  • Eh bien, si vous faites lst1 et lst2 même si la première assertEqual réussit, puis le second, trop.
  • La partie sur "la recherche d'un équivalent de assertItemsEqual plutôt que assertSequenceEqual" n'a pas de sens pour moi. Mon point était que le code dans votre question à l'aide de assertEqual sur deux listes avec des éléments dans un ordre différent et que l'assertion échoue.
  • Si vous contrôlez le code créant les structures de données, peut-être que vous devriez utiliser jeux au lieu de les listes.
InformationsquelleAutor sapi | 2013-08-27