У меня есть следующий модуль FastAPI на Python с соответствующим тестом, но я никогда не могу получить ответ HTTP 200 на вызов await redis_service.set_key, который я делаю. Есть какие-нибудь предложения о том, что я могу делать неправильно?
ЭТО СУЩЕСТВУЮЩИЙ КОД (Я МОГУ ЭТО РЕФАКТОРИРОВАТЬ, НО НУЖНЫ РАБОЧИЕ ТЕСТЫ ПЕРЕД ПОПЫТКОЙ РЕФАКТОРА
from fastapi import FastAPI, HTTPException, Depends, Request
from .logs.log_messages import LOG_MESSAGES_INFO
from services.cache.service.cache_service import RedisService
# Define the service name for logging
service_name = "cache-service"
# Initialize the logger
logger = ServiceLogger(
service_name, LOG_MESSAGES_INFO, os.getenv("LOG_FILE_PATH", "api.log")
)
# Create the FastAPI app
app = FastAPI(docs_url="/api", root_path="/plt/cache-service")
redis_url = os.getenv("REDIS_URL", "redis://127.0.0.1:6379")
redis_service = RedisService(redis_url)
# Define the endpoints
@app.post("/redis/set-key/")
async def set_key(request: Request, key_value: KeyValue, namespace: str):
try:
cr_id = request.headers.get("correlationid")
logger.log("info", "MSREDI001", id=cr_id, method="set_key")
# A BREAKPOINT HERE, DOESN'T ALLOW ME TO STEP INTO set_key
# AND DIRECTLY RAISES AN EXCEPTION WITH 500 =
await redis_service.set_key(namespace, key_value.key, key_value.value, key_value.expire)
return {"status": "success"}
except Exception as e:
logger.log("error", "MSREDE004", method="set_key", id=cr_id, error=str(e))
raise HTTPException(status_code=500, detail=str(e))
Связанный тест:
import pytest
from unittest.mock import patch, MagicMock
from fastapi.testclient import TestClient
from pydantic import BaseModel
from services.cache.main import app
from fakeredis import aioredis
client = TestClient(app)
@pytest.fixture
def fake_redis():
fake_redis_instance = aioredis.FakeRedis()
return fake_redis_instance
@patch('services.cache.main.redis_service') # Mock the RedisService
@patch('services.cache.main.logger') # Mock the logger
def test_set_key_success(mock_logger, mock_redis_service, fake_redis):
# Mock model for the key-value pair
class KeyValue(BaseModel):
key: str
value: str
expire: int
mock_redis_service.set_key = MagicMock(side_effect=fake_redis.set)
mock_logger.log = MagicMock() # Mock the logger
key_value = KeyValue(key="test_key", value="test_value", expire=3600)
headers = {"correlationid": "4af44d6c-9e52-4929-9ff7-bbae3414e92f"}
response = client.post("/redis/set-key/", json={
"key": key_value.key,
"value": key_value.value,
"expire": key_value.expire
}, headers=headers, params={"namespace": "test_namespace"})
# Assert
assert response.status_code == 200 # ALWAYS FAILS THIS ASSERT
assert response.json() == {"status": "success"}
Подробнее здесь: https://stackoverflow.com/questions/792 ... n-http-500
Издевательство с помощью fakeredis+python приводит к HTTP 500 ⇐ Python
Программы на Python
-
Anonymous
1733173322
Anonymous
У меня есть следующий модуль FastAPI на Python с соответствующим тестом, но я никогда не могу получить ответ HTTP 200 на вызов await redis_service.set_key, который я делаю. Есть какие-нибудь предложения о том, что я могу делать неправильно?
ЭТО СУЩЕСТВУЮЩИЙ КОД (Я МОГУ ЭТО РЕФАКТОРИРОВАТЬ, НО НУЖНЫ РАБОЧИЕ ТЕСТЫ ПЕРЕД ПОПЫТКОЙ РЕФАКТОРА
from fastapi import FastAPI, HTTPException, Depends, Request
from .logs.log_messages import LOG_MESSAGES_INFO
from services.cache.service.cache_service import RedisService
# Define the service name for logging
service_name = "cache-service"
# Initialize the logger
logger = ServiceLogger(
service_name, LOG_MESSAGES_INFO, os.getenv("LOG_FILE_PATH", "api.log")
)
# Create the FastAPI app
app = FastAPI(docs_url="/api", root_path="/plt/cache-service")
redis_url = os.getenv("REDIS_URL", "redis://127.0.0.1:6379")
redis_service = RedisService(redis_url)
# Define the endpoints
@app.post("/redis/set-key/")
async def set_key(request: Request, key_value: KeyValue, namespace: str):
try:
cr_id = request.headers.get("correlationid")
logger.log("info", "MSREDI001", id=cr_id, method="set_key")
# A BREAKPOINT HERE, DOESN'T ALLOW ME TO STEP INTO set_key
# AND DIRECTLY RAISES AN EXCEPTION WITH 500 =
await redis_service.set_key(namespace, key_value.key, key_value.value, key_value.expire)
return {"status": "success"}
except Exception as e:
logger.log("error", "MSREDE004", method="set_key", id=cr_id, error=str(e))
raise HTTPException(status_code=500, detail=str(e))
Связанный тест:
import pytest
from unittest.mock import patch, MagicMock
from fastapi.testclient import TestClient
from pydantic import BaseModel
from services.cache.main import app
from fakeredis import aioredis
client = TestClient(app)
@pytest.fixture
def fake_redis():
fake_redis_instance = aioredis.FakeRedis()
return fake_redis_instance
@patch('services.cache.main.redis_service') # Mock the RedisService
@patch('services.cache.main.logger') # Mock the logger
def test_set_key_success(mock_logger, mock_redis_service, fake_redis):
# Mock model for the key-value pair
class KeyValue(BaseModel):
key: str
value: str
expire: int
mock_redis_service.set_key = MagicMock(side_effect=fake_redis.set)
mock_logger.log = MagicMock() # Mock the logger
key_value = KeyValue(key="test_key", value="test_value", expire=3600)
headers = {"correlationid": "4af44d6c-9e52-4929-9ff7-bbae3414e92f"}
response = client.post("/redis/set-key/", json={
"key": key_value.key,
"value": key_value.value,
"expire": key_value.expire
}, headers=headers, params={"namespace": "test_namespace"})
# Assert
assert response.status_code == 200 # ALWAYS FAILS THIS ASSERT
assert response.json() == {"status": "success"}
Подробнее здесь: [url]https://stackoverflow.com/questions/79235606/mocking-with-fakeredispython-results-in-http-500[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия