assertCountEqual(first, second, msg=None)
测试序列first是否包含与second相同的元素,无论它们的顺序如何。当它们不同时,将生成一个列出两个序列之间差异的错误消息。
重要提示:
调用assertCountEqual(first, second, msg=None)
等效于assertEqual(Counter(list(first)), Counter(list(second)))
。
注:
计数器是可哈希对象计数的字典子类。它是一个集合,其中元素被存储为字典键,并且它们的计数被存储为字典值。
为了使其工作,键必须是可哈希
的,但不幸的是,dict
是不可哈希的
,因为它是可变的。
为了执行所需的任务,您可以使用frozenset
。
frozenset
构建了一个不可变的无序独特元素的集合。 为了使测试成功,您将需要构建一个字典,其中对应于其键的值是不可变的。我们可以使用递归方法来构建包含不可变值的字典。
试试这个(更新):
def getHashableDict(dictionary):
hashable_dict = {}
for key, value in dictionary.items():
if isinstance(value, list):
hashable_dict[key] = frozenset(value)
elif isinstance(value, dict):
hashable_dict[key] = getHashableDict(value)
else:
hashable_dict[key] = value
return frozenset(hashable_dict.items())
def test(self):
desired_output = [{'count': 2, 'columns': ['col2', 'col5']}]
output = [{'count': 2, 'columns': ['col5', 'col2']}]
output = [getHashableDict(item) for item in output]
desired_output = [getHashableDict(item) for item in desired_output]
self.assertCountEqual(output, desired_output)
测试现在将会成功。