我知道,在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 ><
如何通过递归地将-like 语义应用于值来测试诸如此类d1
的字典以d2
正确比较它们的相等性?assertEqual
如果可能的话,我想避免使用外部模块(如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)
上面代码的问题是错误消息不如内置断言那么好,而且我可能忽略了一些边缘情况(因为我只是在脑海中写下了这个)。