我知道,在字典上执行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 ><
如何通过递归地对值应用类似于assertEqual的语义来测试诸如d1和d2这样的字典,以便正确比较它们的相等性?
我希望尽可能避免使用外部模块(如建议的in this question),除非它们是本地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)
上面代码的问题是,错误消息没有内置代码宣称的那么好,而且可能有一些边缘情况我忽略了(就像我刚刚从头顶上写下的那样)。