Rendezvous-Tokyo

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'で調べてもなかなか解決しなかったのでメモとして残しておきます。

以上。