aio-libs / aio-libs/aiohttp

Add test utils for testing ClientSession

Offen
#1,704 14 Kommentare 6 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
enhancement
Vorherrschende Sprache
Python
Sterne
16.5k
Forks
2.4k
Ø Merge
17 Std. 22 Min.
Gemergte PRs (30 T.)
212

Beschreibung

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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.