Skip to content

Add test utils for testing ClientSession #1704

Open
@sashgorokhov

Description

@sashgorokhov

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.

@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')
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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions