Wiem, że podczas wykonywania assertEqual
w słowniku jest wywoływana assertDictEqual
. Podobnie, assertEqual
na sekwencji wykona assertSequenceEqual
.Jak osiągnąć wartość assertDictEqual z wartością assertSequenceEqual zastosowaną do wartości
Jednakże, gdy assertDictEqual
porównuje wartości, wydaje się nie korzystać z assertEqual
, a tym samym assertSequenceEqual
nie jest wywoływana.
Rozważmy następujące proste słowniki:
lst1 = [1, 2]
lst2 = [2, 1]
d1 = {'key': lst1}
d2 = {'key': lst2}
self.assertEqual(lst1, lst2) # True
self.assertEqual(d1, d2) # False ><
Jak mogę przetestować słowniki takie jak d1
i d2
taki, że ich równość jest prawidłowo porównaniu przez rekursywnie stosowania assertEqual
-jak semantykę do wartości?
Chcę uniknąć używania modułów zewnętrznych (zgodnie z sugestią in this question), jeśli w ogóle możliwe, o ile nie są natywnymi rozszerzeniami django.
EDIT
Zasadniczo, co jestem po jest zbudowany w wersji to:
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)
Problem z powyższego kodu jest to, że komunikaty o błędach nie są tak ładne jak builtin twierdzi, i są prawdopodobnie przypadki skrajne, które zignorowałem (tak jak właśnie to napisałem).
z moduł 'unittest'' self.assertEqual (lst1, lst2) 'jest prawda ->' AssertionError: Tabela różnią [1, 2] = [2, 1] '. – martineau
@martineau - mój błąd; Źle przeczytałem tę część dokumentacji. Szukam odpowiednik 'assertItemsEqual' zamiast' assertSequenceEqual' – sapi
dobrze, jeśli uczynić '' lst2' lst1' i tak samo pierwszy 'assertEqual' powiedzie, wówczas drugi będzie też. – martineau