aio-libs / aio-libs/aiohttp

Add test utils for testing ClientSession

Đang mở
#1,704 14 bình luận 6 reaction 0 người được giao Xem trên GitHub
enhancement
Ngôn ngữ chính
Python
Star
16.5k
Fork
2.4k
Merge trung bình
17 giờ 22 phút
Pull request đã merge (30 ngày)
212

Mô tả

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.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.