2017-05-06 77 views
1

我正在编写一个单元测试,它查询trello board API并希望声明某个特定的卡片存在。在Python单元测试中验证trello board API响应

的第一次尝试使用/1/boards/[board_id]/lists rewuest其给出的结果一样:

[{'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) 

,但我收到一个错误:“类型错误:JSON对象必须海峡,字节或字节组,而不是‘名单’。

然后,使用/1/boards/[board_id]/cards要求发现给的卡普通列表:

[ 
    {'id': 'id1', 'name': 'item1'}, 
    {'id': 'id2', 'name': 'item2'}, 
    ... 
] 

我应该如何写这个单元测试断言?

+0

my_list已经是一个Python列表,有没有需要JSON。负载()。 Json.loads()仅适用于JSON序列化的字符串。尝试:'element = [my_list中item的item [0] ['items'] if item ['name'] ==“item6”]' –

回答

1

最好的选择是创建一个类,它将等于您想要确保存在的卡的字典,然后在断言中使用该字典。对于你的榜样,用卡的列表返回在API:

cards = board.get_cards() 
self.assertIn(Card(name="item6"), cards) 

下面是该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) 

您可以根据需要添加更多字段进行验证。

此时值得一提的一个问题是单元测试是否应该进行真正的API查询。一般情况下,单元测试将测试数据集中在您所控制的功能上,但这可能是您使用unittest模块进行trello部署的集成测试。

+0

谢谢,尽管我必须说我只是一个初学者,而我(例如,返回“{}({!r},{!r})”格式( self .__ class __.__ name__,self.key,self.value)。我也以某种方式我自己解决了这个问题:)我被固定在这个列表上,我忘记了我可以轻松做到这一点。 – Mina

+0

在你的问题上有点揣测,所以我的答案可能比你需要的更通用,知道它的trello板API有帮助。有关格式字符串的含义,请参见['str.format()'docs](https://docs.python.org/3/library/string.html#formatstrings) - 该方法使对象在输出时具有合理的输出传递给'repr()'。 –

1
import unittest 
from urllib.request import urlopen 
import json 

class Basic(unittest.TestCase): 

    url = 'https://api.trello.com/1/boards/[my_id]/cards?fields=id,name,idList,url&key=[my_key]&token=[my_token]' 
    response = urlopen(url) 

    resp = response.read() 
    json_ob = json.loads(resp) 

    el_list = [item for item in json_ob if item['name'] == 'card6'] 

    def testBasic(self): 
     self.assertTrue(self.el_list) 

if __name__ == '__main__': 
    unittest.main() 

所以我做错了什么:我过于注重列表本身,我用下面的代码后上了车:

import requests 
from pprint import pprint 
import json 

url = "https://api.trello.com/1/boards/[my_id]/lists" 

params = {"cards":"open","card_fields":"name","fields":"name","key":"[my_key]","token":"[my_token]"} 

response = requests.get(url=url, params=params) 
pprint(response.json())