FastAPI TestClient переопределяет функцию срока службыPython

Программы на Python
Ответить
Anonymous
 FastAPI TestClient переопределяет функцию срока службы

Сообщение Anonymous »

В более сложной настройке с использованием инфраструктуры инжектора зависимостей Python я использую функцию продолжительности жизни для объекта приложения FastAPI, чтобы правильно все связать.
При тестировании я хотел бы заменить некоторые объекты разными версиями (подделками), и естественным способом достижения этой цели мне кажется, что я должен переопределить или имитировать функцию продолжительности жизни объекта приложения. Однако я не могу понять, смогу ли я это сделать и как это сделать.
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"
Итак, в основном в приспособлении fake_client я хотел бы изменить его, чтобы использовать _lifespan_override вместо исходного _lifespan, чтобы фиктивный тестовый пример прошел успешно
Я ожидал, что что-то вроде 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»