Где и как это применить — подумайте сами, а пока просто интересный пример.
Допустим, у нас есть клиент:
class Client:
...
def execute(
self,
query: str,
variables: dict[str, Any] | None = None,
operation_name: str | None = None,
headers: dict[str, Any] | None = None,
**kwargs: Any,
) -> dict[str, Any]:
headers = headers or {}
url = self._get_base_url()
final_headers = self._default_headers()
final_headers.update(headers)
transport = HTTPXAsyncTransport(url=url, headers=final_headers)
result = transport.execute(query, variables, operation_name)
return result
Здесь внутри метода:
- есть логика получения актуального host:
url = self._get_base_url()- логика сборки заголовков:
final_headers = self._default_headers()Наша задача — проверить, что всё это правильно собирается и передаётся в HTTPXAsyncTransport.
Но ведь он создаётся прямо внутри метода!
Как же его подменить? 🤔
Вот как можно сделать:
from unittest import patch, Mock
@pytest.fixture
def client() -> Client:
return Client()
@pytest.fixture
def transport():
with patch("lib.client.HTTPXAsyncTransport") as mock_transport:
mock_transport.return_value = Mock()
yield mock_transport
def test_execute(client: Client, transport):
client.execute("query")
assert transport.call_args_list == [
call(
url="http://google.com",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer token",
"User-Agent": "MyApp/1.0"
}
)
]
Что происходит:
1. Мы патчим HTTPXAsyncTransport, подсовываем туда Mock
2. Вызываем client.execute(...)
3. Проверяем, что transport действительно получил нужные аргументы
✅ Проверили не только что вызвался метод, но и что внутренняя логика клиента корректно отработала
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы