我需要测试一个函数,该函数将在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
键
我是否必须遍历列表并一一比较字典,还是有最快的解决方案?
您可以创建词典的副本并从此处弹出随机数
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)