两个嵌套字典的单元测试相等性

4

如果我想要比较两个具有list值的字典,那么我应该使用哪个assert语句?

例如,如果这些字典是这样的:

{'other_parts': ['director', 'head', 'chief', 'leader', 'administrator'], 'headword': 'manager', 'language': 'en'}

{'other_parts': ['director', 'chief', 'head', 'leader', 'administrator'], 'headword': 'manager', 'language': 'en'}

我希望这两个字典的比较能够通过,因为我不关心嵌套列表中的顺序。 使用assertDictEqual进行比较失败了,因为other_parts的嵌套列表顺序不同,我猜测。


理解:列表内的顺序无关紧要,但是一个元素在每个列表中可能出现不同次数,如果是这种情况,则它们被视为不同吗? - Mike
@Mike: other_parts 的最终列表不会包含重复项。 第一个示例只是因为通过而让我感到困惑。 - primoz
在这种情况下,我会更改问题描述以反映您的确切需求 - 否则,答案将与您的特定问题无关。 - Mike
1
@Mike,你说得对,我已经编辑了我的问题。 - primoz
2个回答

3

如果你不关心顺序,你需要对列表进行排序或使用集合(仅当你确信列表中不包含重复项时)。

dict1['other_parts'] = sorted(dict1['other_parts'])
dict2['other_parts'] = sorted(dict2['other_parts'])
assertDictEqual(dict1, dict2)

这也可以用作

from unittest import TestCase
TestCase().assertEqual(dict1, dict2)

请查看文档:https://docs.python.org/3/library/unittest.html#unittest.TestCase.addTypeEqualityFunc


2
在修改了您的问题之后,似乎您正在寻找的是 AssertCountEqual - 它正是您需要的,正如文档中所解释的那样。 如果它无法适用于整个结构,我会使用循环在每个内部列表上运行它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接