Я знаю, что при выполнении assertEqual
в словаре вызывается assertDictEqual
. Аналогично, assertEqual
в последовательности будет выполнять assertSequenceEqual
.
Однако, когда assertDictEqual
сравнивает значения, кажется, что он не использует assertEqual
, и поэтому assertSequenceEqual
не вызывается.
Рассмотрим следующие простые словари:
lst1 = [1, 2]
lst2 = [2, 1]
d1 = {'key': lst1}
d2 = {'key': lst2}
self.assertEqual(lst1, lst2) # True
self.assertEqual(d1, d2) # False ><
Как я могу тестировать словари, такие как d1
и d2
, чтобы их соответствие правильно сравнивалось, рекурсивно применяя семантику assertEqual
к значениям?
Я хочу избежать использования внешних модулей (как предложено в этом вопросе), если это вообще возможно, если только они не являются родными расширениями django.
ИЗМЕНИТЬ
По существу, для меня это встроенная версия:
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)
Проблема с вышеприведенным кодом заключается в том, что сообщения об ошибках не так хороши, как утверждается встроенным, и, возможно, в некоторых случаях я игнорировал (как я только что написал это с моей головы).