我正在编写一个查询trello board API的单元测试,并希望断言存在特定的卡片。
第一次尝试是使用/1/boards/[board_id]/lists
重新提供,其结果如下:
[{'cards': [
{'id': 'id1', 'name': 'item1'},
{'id': 'id2', 'name': 'item2'},
{'id': 'id3', 'name': 'item3'},
{'id': 'id4', 'name': 'item4'},
{'id': 'id5', 'name': 'item5'},
{'id': 'id6', 'name': 'item6'}],
'id': 'id7',
'name': 'ABC'},
{'cards': [], 'id': 'id8', 'name': 'DEF'},
{'cards': [], 'id': 'id9', 'name': 'GHI'}]
我想断言' item6'确实在上面提到的名单中。加载json并使用assertTrue,如下所示:
element = [item for item in json_data if item['name'] == "item6"]
self.assertTrue(element)
但是我收到一个错误:' TypeError:JSON对象必须是str,bytes或bytearray,而不是' list'。
然后使用/1/boards/[board_id]/cards
请求发现了一个简单的卡片列表:
[
{'id': 'id1', 'name': 'item1'},
{'id': 'id2', 'name': 'item2'},
...
]
我应该如何编写这个单元测试断言?
答案 0 :(得分:1)
最新的选择是创建一个类,该类等于您要确保存在的卡的dict,然后在断言中使用它。对于您的示例,使用api返回的卡列表:
Card()
这是class Card(object):
"""Class that matches a dict with card details from json api response."""
def __init__(self, name):
self.name = name
def __eq__(self, other):
if isinstance(other, dict):
return other.get("name", None) == self.name
return NotImplemented
def __repr__(self):
return "{}({!r}, {!r})".format(
self.__class__.__name__, self.key, self.value)
助手类的合理实现,看起来有点复杂,但大部分都是直截了当的:
.so
您可以根据需要添加更多字段进行验证。
此时值得一提的一个问题是单元测试是否应该进行真正的api查询。通常,单元测试会将测试数据集中在您控制的功能上,但这可能是使用unittest模块进行trello部署的集成测试吗?