From 8a99adfb5839b37efee33f2f49c1ba27a954fcbd Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Thu, 5 Dec 2024 09:53:54 +0100 Subject: [PATCH] docs: use `transport` instead of directly pass the app to AsyncClient (#2784) --- docs/testclient.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/testclient.md b/docs/testclient.md index 33da3348..99346af8 100644 --- a/docs/testclient.md +++ b/docs/testclient.md @@ -165,15 +165,17 @@ May raise `starlette.websockets.WebSocketDisconnect`. ### Asynchronous tests Sometimes you will want to do async things outside of your application. -For example, you might want to check the state of your database after calling your app using your existing async database client / infrastructure. +For example, you might want to check the state of your database after calling your app +using your existing async database client/infrastructure. -For these situations, using `TestClient` is difficult because it creates it's own event loop and async resources (like a database connection) often cannot be shared across event loops. +For these situations, using `TestClient` is difficult because it creates it's own event loop and async +resources (like a database connection) often cannot be shared across event loops. The simplest way to work around this is to just make your entire test async and use an async client, like [httpx.AsyncClient]. Here is an example of such a test: ```python -from httpx import AsyncClient +from httpx import AsyncClient, ASGITransport from starlette.applications import Starlette from starlette.routing import Route from starlette.requests import Request @@ -192,7 +194,8 @@ app = Starlette(routes=[Route("/", hello)]) # or install and configure pytest-asyncio (https://github.com/pytest-dev/pytest-asyncio) async def test_app() -> None: # note: you _must_ set `base_url` for relative urls like "/" to work - async with AsyncClient(app=app, base_url="http://testserver") as client: + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://testserver") as client: r = await client.get("/") assert r.status_code == 200 assert r.text == "Hello World!" -- 2.47.3