thirose’s blog

openstackやpythonなどなど

json.dumpsした値が期待した通りか確認するunittest

python3.7以前の辞書(dict)とJSONオブジェクトは順序立てられてません。
今回はだいぶ古いpythonなため、順序立てられていませんでした。
そのため、dictをjson.dumpsしたりすると、順番が崩れたりします。
オプションとして、 json.dumps(dict, sort_keys=True) のような
sort_keysを付けられるようなオプションが存在しています。

今回自分がハマったのはunittest引数として、json.dumpsがセットされたときにその順序をどう検証するのか?
というところで少し手間取ったので、まとめていこうと思います。

m_put.assert_called_once_with(data=json_string, headers=headers)

と、いうメソッドが正しい引数で呼ばれているかの確認ですね。
unittestがなく怖かったのですが、元のコードの挙動が正確にわからないため、
元のコードは極力いじりたくないという思いもありました。

当然コードの方には、その直前に json_string = json.dumps(raw_data) のようなことが書かれています。

call = m_put.call_args
call_args, call_kwargs = call
self.assertEqual(json.loads(call_kwargs['data']), json_string)
self.assertEqual(call_kwargs['headers'], headers)

のように、call_argsで引数を取得し、
jsonの部分は json.loads() して比較することで、問題ないことを確認しました。

docs.python.org

無意識に頭の中でdataの中身がdictと考えてしまい、無駄に時間すごしたし、ランダムに変わってしまう値にどうすべきか、
時間を使ってしまいましたが、 callで取れるという学びがありました。
これで、json.dumps() するときに sort_keys しても大丈夫な確認もとれました。

テスト駆動Python

テスト駆動Python

  • 作者:Brian Okken
  • 発売日: 2018/08/29
  • メディア: 単行本(ソフトカバー)