FastAPIのAsyncClientでのテストで、50xのレスポンスが例外として投げられるのを防ぐ

 
0
このエントリーをはてなブックマークに追加
Kazuki Moriyama
Kazuki Moriyama (森山 和樹)

AsyncClientを使用したテストと50x

fastapiではasyncな関数をテスト関数にしたいときはAsyncClientという、httpxのhttp clientを使用する必要がある。
よく使うTestClientが使えない。

import pytest
from httpx import AsyncClient

from .main import app

@pytest.mark.anyio
async def test_root():
    async with AsyncClient(app=app, base_url="http://test") as ac:
        response = await ac.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Tomato"}

このクライアントは50x系のレスポンスが返却された際には、そのレスポンスを取得できるのではなくアクセス時に例外が投げられてしまう。
この挙動では50x系のレスポンスのテストを書きたいときに素直に書けない。

50xで例外を投げないようにする

方法は簡単で、ASGITransportというのを使って例外を投げないように指定すれば良い。

import pytest
from httpx import AsyncClient

from .main import app

@pytest.mark.anyio
async def test_root():
    transport = httpx.ASGITransport(app=app)
    async with AsyncClient(transport=transport, base_url="http://test") as ac:
        response = await ac.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Tomato"}

参考

info-outline

お知らせ

K.DEVは株式会社KDOTにより運営されています。記事の内容や会社でのITに関わる一般的なご相談に専門の社員がお答えしております。ぜひお気軽にご連絡ください。