我正在创建我的第一个测试脚本(是的!),我有一个字典列表,其中一个键是一个列表。如果列表(在字典中)以任何顺序排列,我希望测试过去。我知道您可以使用assertCountEqual
来检查列表的相等性,而不管顺序如何,但是您可以对包含列表字典的列表执行此操作吗?参见以下示例
将会成功
def test(self):
output = [2,1]
desired_output = [1,2]
self.assertCountEqual(output, desired_output)
将失败
def test(self):
desired_output = [{'count': 2, 'columns': ['col2', 'col5']}]
output = [{'count': 2, 'columns': ['col5', 'col2']}]
self.assertCountEqual(output, desired_output)
谢谢
问题来源:stackoverflow
assertCountEqual(first,second,msg = None)
:
测试序列首先包含与第二序列相同的元素,而不管其顺序如何。否则,将生成一条错误消息,列出序列之间的差异。
重要:
调用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] #--> create list of hashable types
desired_output = [getHashableDict(item) for item in desired_output]
self.assertCountEqual(output, desired_output)
测试现在将成功。
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。