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 queassertSequenceEqual
- Eh bien, si vous faites
lst1
etlst2
même si la premièreassertEqual
réussit, puis le second, trop. - La partie sur "la recherche d'un équivalent de
assertItemsEqual
plutôt queassertSequenceEqual
" n'a pas de sens pour moi. Mon point était que le code dans votre question à l'aide deassertEqual
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.
Vous devez vous connecter pour publier un commentaire.
Lieu de les ignorer assertDictEqual, pourquoi ne pas vous récursive trier vos dicts premier?
Puis trier, et à l'utilisation normale assertDictEqual:
Cette approche a l'avantage de ne pas se soucier de combien de niveaux de profondeur vos listes sont.
Exception: '<' not supported between instances of 'dict' and 'dict'
La
TestCase.assertEqual()
les appels de méthode de la classe'assertDictEqual()
pourdicts
, il suffit donc de remplacer dans votre sous-classe de dérivation. Si vous n'utilisez que les autresassertXXX
méthodes dans la méthode, les messages d'erreur devrait être presque aussi beau que le haut-affirme -- mais si vous pouvez fournir unmsg
argument mot-clé quand vous les appelez pour contrôler ce qui est affiché.De sortie:
assertEqual(lst1, lst2)
être Vrai dans votre code.J'ai eu le même problème, j'ai eu à tester si les champs d'un modèle où les corriger. Et Monmodèle._meta.get_all_field_names() retourne parfois ['a','b'] et, parfois, ['b','a'].
Quand je le lance:
il échoue parfois.
Je l'ai résolu en mettant les deux valeurs dans un ensemble():
Cela ne fonctionnera pas (renvoie true (Vrai) avec:
Mais depuis que je suis vérification pour les noms de champs d'un modèle , et ceux-ci sont uniques, ce qui est bon en moi.
set(['a','b'])
essayer{'a','b'}
. Aussi, il y a une fonctionself.assertSetEqual({'a','a','b','a'}, {'a','b'})
qui permettra de vérifier la différence entre les deux groupes et l'échec si elles ne contiennent pas exactement les mêmes éléments.