### 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
# 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!"