FastAPI - функция насмешливого пути не действует - PullRequest
0 голосов
/ 25 марта 2020

У меня есть простое 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 не работает должным образом, когда функция не вызывается непосредственно в тесте?

Или, возможно, мне следует подойти к моей проблеме каким-то другим способом?

...