]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
📝 Update testing events documentation (#13259)
authorz0z0r4 <z0z0r4@outlook.com>
Sun, 31 Aug 2025 10:29:21 +0000 (18:29 +0800)
committerGitHub <noreply@github.com>
Sun, 31 Aug 2025 10:29:21 +0000 (10:29 +0000)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
docs/en/docs/advanced/testing-events.md
docs_src/app_testing/tutorial004.py [new file with mode: 0644]
tests/test_tutorial/test_testing/test_tutorial004.py [new file with mode: 0644]

index d0f2d1a79f4f8b65b50f8dccc7bc1d69372fadd0..cb8881a09eaf2637c6104aff89346756e993855b 100644 (file)
@@ -1,5 +1,12 @@
-# Testing Events: startup - shutdown { #testing-events-startup-shutdown }
+# Testing Events: lifespan and startup - shutdown { #testing-events-lifespan-and-startup-shutdown }
 
-When you need your event handlers (`startup` and `shutdown`) to run in your tests, you can use the `TestClient` with a `with` statement:
+When you need `lifespan` to run in your tests, you can use the `TestClient` with a `with` statement:
+
+{* ../../docs_src/app_testing/tutorial004.py hl[9:15,18,27:28,30:32,41:43] *}
+
+
+You can read more details about the ["Running lifespan in tests in the official Starlette documentation site."](https://www.starlette.io/lifespan/#running-lifespan-in-tests)
+
+For the deprecated `startup` and `shutdown` events, you can use the `TestClient` as follows:
 
 {* ../../docs_src/app_testing/tutorial003.py hl[9:12,20:24] *}
diff --git a/docs_src/app_testing/tutorial004.py b/docs_src/app_testing/tutorial004.py
new file mode 100644 (file)
index 0000000..f83ac9a
--- /dev/null
@@ -0,0 +1,43 @@
+from contextlib import asynccontextmanager
+
+from fastapi import FastAPI
+from fastapi.testclient import TestClient
+
+items = {}
+
+
+@asynccontextmanager
+async def lifespan(app: FastAPI):
+    items["foo"] = {"name": "Fighters"}
+    items["bar"] = {"name": "Tenders"}
+    yield
+    # clean up items
+    items.clear()
+
+
+app = FastAPI(lifespan=lifespan)
+
+
+@app.get("/items/{item_id}")
+async def read_items(item_id: str):
+    return items[item_id]
+
+
+def test_read_items():
+    # Before the lifespan starts, "items" is still empty
+    assert items == {}
+
+    with TestClient(app) as client:
+        # Inside the "with TestClient" block, the lifespan starts and items added
+        assert items == {"foo": {"name": "Fighters"}, "bar": {"name": "Tenders"}}
+
+        response = client.get("/items/foo")
+        assert response.status_code == 200
+        assert response.json() == {"name": "Fighters"}
+
+        # After the requests is done, the items are still there
+        assert items == {"foo": {"name": "Fighters"}, "bar": {"name": "Tenders"}}
+
+    # The end of the "with TestClient" block simulates terminating the app, so
+    # the lifespan ends and items are cleaned up
+    assert items == {}
diff --git a/tests/test_tutorial/test_testing/test_tutorial004.py b/tests/test_tutorial/test_testing/test_tutorial004.py
new file mode 100644 (file)
index 0000000..812ee44
--- /dev/null
@@ -0,0 +1,5 @@
+from docs_src.app_testing.tutorial004 import test_read_items
+
+
+def test_main():
+    test_read_items()