написать модульный тест для файлов async aiohttp и aio
Я новичок в asyncio. Я использую файлы aiohttp и aiofiles для загрузки изображений. как написать модульные тесты для них обоих.
class ImageDownloader:
def __init__(self, folder_path: str):
self.folder_path = folder_path
async def async_download_image(self, image_name: str, image_url: str):
logging.info("%s downloading is started", image_name)
async with aiohttp.ClientSession() as session:
async with session.get(image_url) as resp:
if resp.status == 200:
logging.info(" %s downloading is finished", image_name)
image_saving_path = os.path.join(self.folder_path, image_name)
logging.info(" %s saving to directory is started", image_name)
file = await aiofiles.open(image_saving_path, mode='wb')
await file.write(await resp.read())
await file.close()
logging.info(" %s saving to directory is finished", image_name)
else:
logging.exception(IMAGE_DOWNLOADER_EXCEPTION + image_name)
raise ImageDownloaderError(IMAGE_DOWNLOADER_EXCEPTION + image_name)
0 ответов
Начиная с Python 3.8 есть
unittest.IsolatedAsyncioTestCase
что позволяет вам удобно протестировать свой модуль записи для любого кода asyncio:
class MyFixture(unittest.IsolatedAsyncioTestCase):
async def test_1(self):
result = await production_code()
self.assertEqual(result, 42)
Что касается
aiohttp
официально рекомендуется (см. предупреждение в документации "Подделка объекта запроса") запустить локальный сервер для тестирования вашего клиента. Если честно, я понятия не имею, почему, поскольку это не согласуется со стандартным правилом имитации дорогих зависимостей. В любом случае, для этого вам нужно изменить дизайн своей функции, чтобы она принимала объект сеанса в качестве параметра. Таким образом, вы можете перенаправить запросы с помощью имитационного преобразователя на ваш локальный тестовый сервер.
async def production_code(client_session):
aync with client_session.get(...) as response:
...
...
async def test_2(self):
with create_mocked_session() as mock:
await production_code(mock)
...
Может быть проще обойтись без всего
aiohttp
lib полностью, имитируя сам объект сеанса и давая подготовить вручную созданные тестовые ответы.
Я понятия не имею о
aiofiles
но тот же шаблон справедлив и для ввода / вывода файлов. Передайте фиктивный файл file_like. который желательно все держит в памяти.