У меня есть простое FastAPI приложение, и я пытаюсь создать для него тесты с pytest
.
Моя цель - проверить, как приложение ведет себя в случае различных ошибки.
У меня есть простой маршрут проверки работоспособности в моем приложении:
from fastapi import APIRouter
router = APIRouter()
@router.get("/health")
async def health():
return "It's working ✨"
Теперь в моем модуле pytest я пытаюсь исправить вышеуказанную функцию, чтобы она вызывала различные ошибки. Я использую unittest.mock
, но у меня очень странное поведение.
import pytest
from unittest import mock
from fastapi import HTTPException
from starlette.testclient import TestClient
import app.api.health
from app.main import app # this is my application (FastAPI instance) with the `router` attached
@pytest.fixture()
def client():
with TestClient(app) as test_client:
yield test_client
def test_simple(client):
def mock_health_function():
raise HTTPException(status_code=400, detail='gibberish')
with mock.patch('app.api.health.health', mock_health_function):
response = client.get(HEALTHCHECK_PATH)
with pytest.raises(HTTPException): # this check passes successfully - my exception is raised
app.api.health.health()
assert response.status_code != 200 # this check does not pass. The original function was called as if nothing was patched
Несмотря на тот факт, что точно такая же функция вызывается внутри теста, клиент теста API все еще вызывает исходную функцию, когда я нажимаю конечная точка.
Почему mock.patch
не работает должным образом, когда функция не вызывается непосредственно в тесте?
Или, возможно, мне следует подойти к моей проблеме каким-то другим способом?