Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I mock out responses made by aiohttp.ClientSession?

I am using aiohttp to make asynchronous requests and I want to test my code. I want to mock out requests sent by aiohttp.ClientSession. I am looking for something similar to the way responses handles mocking for the requests lib.

How can I mock out responses made by aiohttp.ClientSession?

# sample method
async def get_resource(self, session):
    async with aiohttp.ClientSession() as session:
        response = await self.session.get("some-external-api.com/resource")
        if response.status == 200:
            result = await response.json()
            return result

        return {...}

# I want to do something like ...
aiohttp_responses.add(
    method='GET', 
    url="some-external-api.com/resource", 
    status=200, 
    json={"message": "this worked"}
)

async def test_get_resource(self):
    result = await get_resource()
    assert result == {"message": "this worked"}
  • I have read through the aiohttp testing docs. It seems they cover mocking out incoming requests to your web server, but I'm not sure this helps me mock out responses to outgoing requests

Edit

I've used https://github.com/pnuckowski/aioresponses on a few projects and it has worked well for my needs.

like image 568
mcranston18 Avatar asked Aug 28 '19 19:08

mcranston18


2 Answers

  1. create mockresponse
class MockResponse:
    def __init__(self, text, status):
        self._text = text
        self.status = status

    async def text(self):
        return self._text

    async def __aexit__(self, exc_type, exc, tb):
        pass

    async def __aenter__(self):
        return self
  1. use pytest mocker mock the request
@pytest.mark.asyncio
async def test_exchange_access_token(self, mocker):
    data = {}

    resp = MockResponse(json.dumps(data), 200)

    mocker.patch('aiohttp.ClientSession.post', return_value=resp)

    resp_dict = await account_api.exchange_access_token('111')
like image 162
bing_2019 Avatar answered Sep 16 '22 13:09

bing_2019


Since I posted this question, I have used this library for mocking out aiohttp requests: https://github.com/pnuckowski/aioresponses and it has worked well for my needs.

like image 33
mcranston18 Avatar answered Sep 17 '22 13:09

mcranston18