aio-libs / aio-libs/aiohttp

Add test utils for testing ClientSession

Abierto
#1,704 14 comentarios 6 reacciones 0 asignados Ver en GitHub
enhancement
Lenguaje dominante
Python
Estrellas
16.5k
Forks
2.4k
Merge medio
17 h 22 min
PR fusionados (30 d)
212

Descripción

Currently there are test utils in `aiohttp.test_utils` that helps to test aiohttp servers and clients.
But what about `aiohttp.ClientSession` ? How people could test that, mock it properly? Make it return developer-defined response without actually touching network?

That was a real pain for me until i wrote some helper functions for that.

```python
@contextlib.contextmanager
def mock_session(response, session=None, mock_object=None):
"""
:param aiohttp.ClientSession session:
:param aiohttp.ClientResponse|list[aiohttp.ClientResponse] response:
"""
session = session or aiohttp.ClientSession()
request = session._request

session.mock = mock_object or mock.Mock()
if isinstance(response, (list, tuple)):
session.mock.side_effect = response
else:
session.mock.return_value = response

async def _request(*args, **kwargs):
return session.mock(*args, **kwargs)

session._request = _request

try:
yield session
finally:
session._request = request
delattr(session, 'mock')
```

```python
def create_response(method, url, content, loop=None):
loop = loop or asyncio.get_event_loop()

response = aiohttp.ClientResponse(method.lower(), URL(url))

def side_effect(*args, **kwargs):
fut = loop.create_future()
if isinstance(content, str):
fut.set_result(content.encode())
else:
fut.set_result(content)
return fut

response.content = mock.Mock()
response.content.read.side_effect = side_effect

return response
```

Does `aiohttp.test_utils` need such functions? I could provide a PR for that.

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.