Tenemos una aplicación FastApi y usamos httpx AsyncClient con fines de prueba. Estamos experimentando un problema en el que las pruebas unitarias se ejecutan localmente bien pero fallan en el servidor CI (acciones de Github).
Después de más investigaciones, nos encontramos con esta solución propuesta al establecer raise_server_exceptions=False en False .
client = TestClient(app, raise_server_exceptions=False)Sin embargo, esto es para el cliente de sincronización. Estamos usando el cliente asíncrono.
@pytest.fixture async def client(test_app): async with AsyncClient(app=test_app, base_url="http://testserver") as client: yield client AsyncClient no admite la opción raise_app_exceptions=False .
¿Alguien tiene experiencia con esto? Gracias
El problema es causado por la versión FastApi. Puede usar fastapi==0.65.0 e incluso sin el objeto ASGITransport y el indicador raise_app_exceptions=False, podrá ejecutar las pruebas que verifican la creación de excepciones personalizadas. Además, la versión fastapi debe congelarse en el archivo de requisitos. Puedes leer más aquí
Para httpx v0.14.0+ necesita usar httpx.ASGITransport . Extracto de la documentación oficial :
Para algunos casos más complejos, es posible que deba personalizar el transporte ASGI. Esto le permite:
- Inspeccione 500 respuestas de error en lugar de generar excepciones configurando raise_app_exceptions=False.
- Monte la aplicación ASGI en una subruta configurando root_path.
- Use una dirección de cliente determinada para las solicitudes configurando client.
Por ejemplo:
# Instantiate a client that makes ASGI requests with a client IP of "1.2.3.4", # on port 123. transport = httpx.ASGITransport(app=app, raise_app_exceptions=False, client=("1.2.3.4", 123)) async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client: ...