@reqww

Код ответа 422 от приложения FastAPI на запрос из теста на pytest с использованием клиента httpx.AsyncClient методом POST?

Я пытаюсь отправить запрос к API, используя pytest через httpx.AsynClient

@pytest.mark.anyio
async def test_device_create_with_data(self, client, random_uuid):
    device_create = DeviceCreateFactory.build(subId=random_uuid)

    json = device_create.json(by_alias=True)

    response = await client.post("/device", json=json)

    assert response.status_code == 200


Фикстура client:

from httpx import AsyncClient


@pytest.fixture(scope="session")
async def client():
    async with AsyncClient(
            app=app,
            base_url="http://test/api/pc",
            headers={"Content-Type": "application/json"}
    ) as client:
        yield client


API endpoint:
@device_router.post("/device", response_model=CommonResponse)
async def create_device(device: DeviceCreate):
    _, err = await crud_device.create_device(device)

    if err:
        return get_common_response(400, err)

    return get_common_response(200, "ok")


Schemas:
class DeviceBase(BaseModel):
    device_id: StrictStr = Field(..., alias='deviceId')
    device_name: StrictStr = Field(..., alias='deviceName')
    device_type: StrictStr = Field(..., alias='deviceType')
    age_mode: AgeModeType = Field(..., alias='ageMode')

    class Config:
        allow_population_by_field_name = True
        validate_all = True
        validate_assignment = True


class DeviceCreate(DeviceBase):
    sub_id: StrictStr = Field(..., alias='subId')

    class Config:
        orm_mode = True


Factory:
from pydantic_factories import ModelFactory

from app.core.schemas.device import DeviceCreate


class DeviceCreateFactory(ModelFactory):
    __model__ = DeviceCreate

И я получаю ошибку **422** со следующим содержанием ответа:
"message":"bad request","details":{"deviceId":"field required","deviceName":"field required","deviceType":"field required","ageMode":"field required","subId":"field required"}


Затем я изучил данные отправляемого запроса и получил:
b'"{\\"deviceId\\": \\"de\\", \\"deviceName\\": \\"\\", \\"deviceType\\": \\"\\", \\"ageMode\\": \\"child\\", \\"subId\\": \\"11aded61-9966-4be1-a781-387f75346811\\"}"'


Вроде бы все хорошо, но в чем же тогда беда?

Я попытался проверить данные запроса в обработчике исключений 422.
Я сделал:
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):

    print(await request.json())

    response = validation_error_response(exc)
    return JSONResponse(
        status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
        content=jsonable_encoder(response.dict())
    )


Но код после print(await request.json()) недостижим, так как это выражение почему-то работает вечно.

Есть ли способ справиться с этой проблемой?
Буду благодарен за любой совет!
P.S.

python version: 3.8.9

fastapi version: 0.68.1

httpx version: 0.21.1
  • Вопрос задан
  • 741 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы