So che, quando si esegue assertEqual
su un dizionario, viene chiamato assertDictEqual
. Allo stesso modo, assertEqual
su una sequenza eseguirà assertSequenceEqual
.Come ottenere assertDictEqual con assertSequenceEqual applicato ai valori
Tuttavia, quando assertDictEqual
sta confrontando i valori, sembra non utilizzare assertEqual
e pertanto non si chiama assertSequenceEqual
.
Si consideri il seguente dizionari semplice:
lst1 = [1, 2]
lst2 = [2, 1]
d1 = {'key': lst1}
d2 = {'key': lst2}
self.assertEqual(lst1, lst2) # True
self.assertEqual(d1, d2) # False ><
Come posso testare dizionari quali d1
e d2
in modo tale che la loro uguaglianza sia adeguatamente confrontato, applicando ricorsivamente assertEqual
-come semantica per i valori?
Desidero evitare l'uso di moduli esterni (come suggerito in this question) se possibile, a meno che non siano estensioni native di django.
EDIT
In sostanza, quello che sono dopo è una costruito nel versione di questo:
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)
Il problema con il codice di cui sopra è che i messaggi di errore non sono bello come il affermazioni incorporate, e ci sono probabilmente casi limite che ho ignorato (come ho appena scritto in cima alla mia testa).
Con il modulo 'unittest',' self.assertEqual (lst1, lst2) 'non è True ->' AssertionError: Lists differing: [1, 2]! = [2, 1] '. – martineau
@martineau - il mio errore; Ho letto male quella parte della documentazione. Sto cercando un equivalente di 'assertItemsEqual' piuttosto che 'assertSequenceEqual' – sapi
Bene, se rendi' lst1' e 'lst2' lo stesso così il primo' assertEqual' riesce, allora anche il secondo lo farà. – martineau