Короткий ответ
В тестах создаётся TestClient, а реальная зависимость (например, get_db) подменяется на тестовую версию через app.dependency_overrides[get_db] = override_get_db, которая возвращает соединение с тестовой/in-memory БД или фиктивный объект.
Как это работает подробнее
dependency_overrides — словарь на уровне FastAPI-приложения, где ключ — исходная функция-зависимость, значение — функция-замена. FastAPI проверяет этот словарь перед вызовом Depends(...), и если есть переопределение, используется оно вместо оригинальной функции во всех эндпоинтах, ссылающихся на эту зависимость.
Пример кода
example.py
from fastapi.testclient import TestClient
from myapp.main import app
from myapp.deps import get_db
def override_get_db():
yield "fake-test-db-session"
def test_list_items():
app.dependency_overrides[get_db] = override_get_db
client = TestClient(app)
response = client.get("/items/")
assert response.status_code == 200
app.dependency_overrides.clear()Что использовать на практике
- Практика. Такой подход позволяет тестировать бизнес-логику эндпоинта изолированно, используя SQLite in-memory или mock-объект вместо реальной production БД, значительно ускоряя тесты и делая их независимыми от внешней инфраструктуры. После теста важно очищать
dependency_overrides(например, через фикстуру сyieldиapp.dependency_overrides.clear()), чтобы не влиять на другие тесты.
Подводные камни
- Риск. Забывают очистить
dependency_overridesпосле теста, из-за чего подмена «утекает» в другие тестовые функции и даёт ложные результаты; подменяют зависимость по неправильному ключу (например, по обёртке, а не по оригинальной функции, если использовалиfunctools.partialили лямбду при объявленииDepends).