2017-05-06 6 views
1

私はtrello board APIを照会し、特定のカードが存在することを主張するunittestを書いています。Python unittestでtrelloボードAPIの応答を確認する

最初の試みは、使用していた/1/boards/[board_id]/listsような結果与えるrewuest:私は「item6」は、上記のリストに実際にあることを主張したい

[{'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'}] 

を。 JSONをロードしているassertTrueを使用して、次のように:

element = [item for item in json_data if item['name'] == "item6"] 
self.assertTrue(element) 

が、私はエラーが表示:「例外TypeError:JSONオブジェクトはstrをしなければならない、バイトまたはByteArrayのではなく、 'リスト' を。そして、/1/boards/[board_id]/cards要求を使用して発見し

は、カードのプレーンなリストを与える:

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

は、どのように私はこのunittestのアサーションを記述する必要がありますか?

+0

my_listという、すでにPythonのリストであり、JSONのために必要ではありません。負荷()。 Json.loads()は、JSONシリアライズされた文字列に対してのみ機能します。 '' name '' == "item6"] ' –

答えて

1

一番きれいな選択肢は、カードが存在することを保証するカードのdictと等しくなるクラスを作成し、それをアサーションで使用することです。あなたの例では、カードの一覧には、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

の場合、my_list [0] ['items']のアイテムのアイテムです。ありがとう、私はちょうど初心者です。あなたのコードからまだ多くのことを理解してはいけません( "{} r {{r}、{!r})"のように)戻ってきてください。私はこのリストにこのように固定されていました。私はこれをもっと簡単に行うことができないことを忘れていました。 – Mina

+0

私の答えはあなたが必要とするより一般的である可能性が高いので、あなたの問題で少し推測していました。書式文字列の意味については、['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())