При тестировании я хотел бы заменить некоторые объекты разными версиями (подделками), и естественным способом достижения этой цели мне кажется, что я должен переопределить или имитировать функцию продолжительности жизни объекта приложения. Однако я не могу понять, смогу ли я это сделать и как это сделать.
MRE следует
Код: Выделить всё
import pytest
from contextlib import asynccontextmanager
from fastapi.testclient import TestClient
from fastapi import FastAPI, Response, status
greeting = None
@asynccontextmanager
async def _lifespan(app: FastAPI):
# Initialize dependency injection
global greeting
greeting = "Hello"
yield
@asynccontextmanager
async def _lifespan_override(app: FastAPI):
# Initialize dependency injection
global greeting
greeting = "Hi"
yield
app = FastAPI(title="Test", lifespan=_lifespan)
@app.get("/")
async def root():
return Response(status_code=status.HTTP_200_OK, content=greeting)
@pytest.fixture
def fake_client():
with TestClient(app) as client:
yield client
def test_override(fake_client):
response = fake_client.get("/")
assert response.text == "Hi"
Я ожидал, что что-то вроде TestClient(app, lifespan=_lifespan_override) as client: будет работать, но это не поддерживается. Есть ли какой-нибудь способ издеваться над ним, чтобы добиться желаемого поведения?
(Приведенное выше mre работает, если вы замените «Привет» на «Привет» в операторе утверждения)
pyproject.toml ниже с необходимыми зависимостями
Код: Выделить всё
[tool.poetry]
name = "mre"
version = "0.1.0"
description = "mre"
authors = []
[tool.poetry.dependencies]
python = "^3.10"
fastapi = "^0.103.2"
[tool.poetry.group.dev.dependencies]
pytest = "^7.1.2"
httpx = "^0.25.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Попробовал расширить свой код с помощью предложения Хамеда Ахавана ниже следующим образом:
Код: Выделить всё
@pytest.fixture
def fake_client():
app.dependency_overrides[_lifespan] = _lifespan_override
with TestClient(app) as client:
yield client
Подробнее здесь: https://stackoverflow.com/questions/772 ... n-function
Мобильная версия