написать модульный тест для файлов 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. который желательно все держит в памяти.

Другие вопросы по тегам