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()
して比較することで、問題ないことを確認しました。
無意識に頭の中でdataの中身がdictと考えてしまい、無駄に時間すごしたし、ランダムに変わってしまう値にどうすべきか、
時間を使ってしまいましたが、 callで取れるという学びがありました。
これで、json.dumps()
するときに sort_keys しても大丈夫な確認もとれました。
- 作者:Brian Okken
- 発売日: 2018/08/29
- メディア: 単行本(ソフトカバー)