PytestでHTTPErrorを発生させようとして KeyError:'file' に出会った
はじめに
PytestでHTTPErrorを発生させて、その中のエラーメッセージを見てちゃんとハンドリングするよねって確認がしたかった。
結論から先
HTTPErrorの作成部分はこれでいけた。
import io
import json
import urllib.parse
import urllib.request
res = urllib.error.HTTPError(
"ut_url",
400,
"ut_reason",
{},
io.BytesIO(json.dumps({"error": {"message": "hoge", "code": 10}}).encode()),
)
print(res.getcode())
print(json.loads(res.read()))
上記のHTTPErrorの作成部分をMockのside_effectなどに指定すればOK。
途中立ちはだかったエラー
KeyError: 'file'
read()するタイミングで発生。
引数の位置が間違ってるのが原因だった。
res = urllib.error.HTTPError(
"test_url", # url
400, # code
io.BytesIO(json.dumps({"error": {"message": "hoge", "code": 10}}).encode()),
{}, # header
None, # read()させたいならここにデータを指定しないとダメだった
)
あとはread()させるってことは file-like-object
にする必要があるため、io.BytesIO
で囲む必要があった。
HTTPError KeyError: 'file'
で調べてもなかなか解決しなかったのでメモとして残しておきます。
以上。