4

I have a simple asynchronous functions that fetches JSON from the web:

async def fetch (session : aiohttp.ClientSession, url : str, pageSize : int = 100, pageNumber : int = 0):
    async with session.get(url, params={'pageSize' : f"{pageSize}", 'pageNumber' : f"{pageNumber}"}) as response:
        return await response.json()

How do I write unit tests for it? I am learning how to do that in Python currently and I have settled down on using unittest and aiounittest modules. The scaffolding that I use for testing is as follows:

class AsyncTest(aiounittest.AsyncTestCase):
    async def test_fetch(self):
        mocked_session = ... #no idea how to create
        json = await fetch(mocked_session, "url_for_mock", 10, 0)

I think I would have to somehow mock the session argument using unittest.Mock() functionality to return some harcoded json data but I am a little lost on how to do this so it works inside async with statement. I have never used an unit testing library in Python and an example would be very helpful here. I am using Python 3.8 and aiohttp for networking.

1 Answer 1

6

I was able to mock the asynchronous resource manager by implementing my own version of __aenter__ magic method and using AsyncMock to mock relevant async methods. The proof of concept test that mocks network calls looks like follows:

class AsyncTest(aiounittest.AsyncTestCase):
    async def test_fetch(self):

        request_mock = AsyncMock()
        request_mock.__aenter__.return_value = request_mock
        request_mock.json.return_value = { 'hello' : 'world'}

        session = Mock()
        session.get.return_value = request_mock

        json = await fetch(session, "url_for_mock", 10, 0)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.