assertEqual等于两个,只有一个键

问题描述 投票:1回答:2

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

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

random键外,如何用合适的结果检查返回的字典?

我的意思是,如果通过了这两个命令,则assertEqual(a, result)应该返回True

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

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

反正在assertEqual中是否有这种例外情况,或者我必须使用assert

UPDATE:

感谢大家,我得到了很好的解决方案,但是如果我得到包含这些命令的列表,该怎么办?

assertEqual(list_of_dicts, expected_result_list)

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

list1 = [
 d1,
 d2,
 d3
]

list2 = [
 d1,
 d2,
 d3
]

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

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

python django testing assert
2个回答
0
投票

您可以创建词典的副本并从此处弹出随机数

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)

1
投票

除了复制和修改两个副本之外,您还可以复制和修改其中一个字典来纠正差异:

a_copy = a.copy()
a_copy['random'] = b['random']
assertEqual(a_copy, b)
© www.soinside.com 2019 - 2024. All rights reserved.