assertEqual 除一个键外的两个字典

assertEqual two dicts except one key

我需要测试一个函数,它将 return 一个带有 django 中的 rest_framework.test.APITestCase's assertEqual 的字典。字典是这样的:

{
    "first_name": "John",
    "last_name": "Doe",
    "random": some random number
}

除了 random 键,我如何用我合适的结果检查 returned 字典?

我的意思是 assertEqual(a, result) 应该 return True 如果这两个命令通过:

a = {
        "first_name": "John",
        "last_name": "Doe",
        "random": 12
    }

result = {
        "first_name": "John",
        "last_name": "Doe",
        "random": 24
    }

assertEqual 中是否有任何例外情况,或者我必须使用 assert

更新:

感谢大家,我得到了很好的解决方案,但是如果我得到一个包含这些命令的列表,比如:

assertEqual(list_of_dicts, expected_result_list)

我的意思是在这两个列表中:

list1 = [
 d1,
 d2,
 d3
]

list2 = [
 d1,
 d2,
 d3
]

应该相等而不考虑每个字典中的random

我是否必须循环遍历列表并逐一比较字典,还是有最快的解决方案?

您可以创建字典的副本并从那里弹出随机数

a_copy = a.copy()
a_copy.pop("random")
result_copy = result.copy()
result_copy.pop("random")

assertEqual(a_copy, result_copy)

如果您不想保留原文,请直接在现有词典上使用pop()

如果你有两个字典列表,你可以用 zip 遍历它们并比较每一对

for l, r in zip(copy.deepcopy(list_of_dicts), copy.deepcopy(expected_result_list)):
    l.pop("random")
    r.pop("random")
    assertEqual(l, r)

与其复制和修改两个副本,不如复制和修改其中一个字典以更正差异:

a_copy = a.copy()
a_copy['random'] = b['random']
assertEqual(a_copy, b)