Mock aiohttp request in unittests
Here is an example for the python 3.7.3 and the next versions of libs
aiohttp==3.5.4
asynctest==0.12.3
from typing import Dict
from aiohttp import ClientSession
from aiohttp.web_exceptions import HTTPInternalServerError
async def send_request() -> Dict:
async with ClientSession() as session:
async with session.get('http://localhost') as response:
if response.status != 200:
raise HTTPInternalServerError()
return await response.json()
from asynctest import patch, CoroutineMock
from aiohttp import web
from aiohttp.web_exceptions import HTTPInternalServerError
from aiohttp.test_utils import AioHTTPTestCase, unittest_run_loop
from .main import send_request
class SendRequestTestCase(AioHTTPTestCase):
def set_get_mock_response(self, mock_get, status, json_data):
mock_get.return_value.__aenter__.return_value.status = status
mock_get.return_value.__aenter__.return_value.json = CoroutineMock(return_value=json_data)
async def get_application(self):
return web.Application()
@unittest_run_loop
@patch('aiohttp.ClientSession.get')
async def test_success(self, mock_get):
self.set_get_mock_response(mock_get, 200, {'test': True})
response = await send_request()
assert response['test']
@unittest_run_loop
@patch('aiohttp.ClientSession.get')
async def test_fail(self, mock_get):
self.set_get_mock_response(mock_get, 500, {})
with self.assertRaises(HTTPInternalServerError):
await send_request()