diff --git a/docs/testclient.md b/docs/testclient.md index 33da3348b..99346af8b 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!"