У меня есть файл маршрутизатора fastapi, в котором есть функция, вызывающая служебную функцию в другом файле, который взаимодействует с GCS. Я хочу смоделировать весь gcsutil.create_bucket в модульном тесте Institutions.py:
institutions.py
from google.cloud import storage
from ..gcsutil import generate_upload_signed_url, create_bucket, create_folders
# .... other imports
router = APIRouter(
tags=["institutions"],
)
@router.post("/institutions/", response_model=Institution)
def create_institution(
req: InstitutionCreationRequest,
current_user: Annotated[BaseUser, Depends()],
sql_session: Annotated[Session, Depends(get_session)],
) -> Any:
bucket_name = "FOO"
try:
# WANT TO MOCK OUT THE BELOW create_bucket
create_bucket(bucket_name)
except ValueError as e:
raise HTTPException(...SOME ERROR...)
return {}
gcsutil.py
from google.cloud import storage, storage_control_v2
from google.cloud.storage import Client
from typing import Any
def create_bucket(bucket_name: str) -> Any:
client = storage.Client()
bucket = client.bucket(bucket_name)
if bucket.exists():
raise ValueError(bucket_name + " already exists. Creation failed.")
bucket.storage_class = "STANDARD"
new_bucket = client.create_bucket(bucket, location="us")
return new_bucket
institutions_test.py
from fastapi.testclient import TestClient
import pytest
import unittest
from unittest import mock
from unittest.mock import Mock
from . import institutions
from ..main import app
@pytest.fixture(name="session")
def session_fixture():
# sets up databases
@pytest.fixture(name="client")
def client_fixture(session: sqlalchemy.orm.Session):
def get_session_override():
return session
app.include_router(institutions.router)
app.dependency_overrides[get_session] = get_session_override
client = TestClient(app)
yield client
app.dependency_overrides.clear()
mock.patch(institutions.__name__ + '.create_bucket', Mock(return_value=None))
def test_create_inst(mock_storage, client):
mock_gcs_client = mock_storage.Client.return_value
mock_bucket = Mock()
mock_bucket.blob.return_value.download_as_string.return_value = "foobar".encode('utf-8')
mock_gcs_client.bucket.return_value = mock_bucket
response = client.post("/institutions/12345")
assert response.status_code == 200
На основе декоратора @Patch, который не совместим с приспособлением pytest. Как имитировать использование относительных путей патча?
Однако я получаю эту ошибку:
fixture 'mock_create_bucket' not found
> available fixtures: _session_faker, anyio_backend, anyio_backend_name, anyio_backend_options, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, client, doctest_namespace, faker, monkeypatch, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, session, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
> use 'pytest --fixtures [testpath]' for help on them.
Подробнее здесь: https://stackoverflow.com/questions/793 ... unit-tests
Как использовать макет Python с модульными тестами Fastapi? ⇐ Python
Программы на Python
-
Anonymous
1735134494
Anonymous
У меня есть файл маршрутизатора fastapi, в котором есть функция, вызывающая служебную функцию в другом файле, который взаимодействует с GCS. Я хочу смоделировать весь gcsutil.create_bucket в модульном тесте Institutions.py:
institutions.py
from google.cloud import storage
from ..gcsutil import generate_upload_signed_url, create_bucket, create_folders
# .... other imports
router = APIRouter(
tags=["institutions"],
)
@router.post("/institutions/", response_model=Institution)
def create_institution(
req: InstitutionCreationRequest,
current_user: Annotated[BaseUser, Depends()],
sql_session: Annotated[Session, Depends(get_session)],
) -> Any:
bucket_name = "FOO"
try:
# WANT TO MOCK OUT THE BELOW create_bucket
create_bucket(bucket_name)
except ValueError as e:
raise HTTPException(...SOME ERROR...)
return {}
gcsutil.py
from google.cloud import storage, storage_control_v2
from google.cloud.storage import Client
from typing import Any
def create_bucket(bucket_name: str) -> Any:
client = storage.Client()
bucket = client.bucket(bucket_name)
if bucket.exists():
raise ValueError(bucket_name + " already exists. Creation failed.")
bucket.storage_class = "STANDARD"
new_bucket = client.create_bucket(bucket, location="us")
return new_bucket
institutions_test.py
from fastapi.testclient import TestClient
import pytest
import unittest
from unittest import mock
from unittest.mock import Mock
from . import institutions
from ..main import app
@pytest.fixture(name="session")
def session_fixture():
# sets up databases
@pytest.fixture(name="client")
def client_fixture(session: sqlalchemy.orm.Session):
def get_session_override():
return session
app.include_router(institutions.router)
app.dependency_overrides[get_session] = get_session_override
client = TestClient(app)
yield client
app.dependency_overrides.clear()
mock.patch(institutions.__name__ + '.create_bucket', Mock(return_value=None))
def test_create_inst(mock_storage, client):
mock_gcs_client = mock_storage.Client.return_value
mock_bucket = Mock()
mock_bucket.blob.return_value.download_as_string.return_value = "foobar".encode('utf-8')
mock_gcs_client.bucket.return_value = mock_bucket
response = client.post("/institutions/12345")
assert response.status_code == 200
На основе декоратора @Patch, который не совместим с приспособлением pytest. Как имитировать использование относительных путей патча?
Однако я получаю эту ошибку:
fixture 'mock_create_bucket' not found
> available fixtures: _session_faker, anyio_backend, anyio_backend_name, anyio_backend_options, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, client, doctest_namespace, faker, monkeypatch, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, session, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
> use 'pytest --fixtures [testpath]' for help on them.
Подробнее здесь: [url]https://stackoverflow.com/questions/79307688/how-to-use-python-mock-with-fastapi-unit-tests[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия