Тестирование и макетирование асинхронного кода, который использует asyn c с оператором - PullRequest
1 голос
/ 10 февраля 2020

У меня есть простые асинхронные функции, которые извлекают JSON из Интернета:

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()

Как мне написать для него модульные тесты? Я учусь делать это в Python в настоящее время, и я остановился на использовании модулей unittest и aiounittest. Леса, которые я использую для тестирования: немного потерялся, как это сделать, чтобы он работал внутри оператора async with. Я никогда не использовал библиотеку модульного тестирования в Python, и пример здесь будет очень полезен. Я использую Python 3.8 и aiohttp для работы в сети.

1 Ответ

0 голосов
/ 10 февраля 2020

Я смог смоделировать асинхронный менеджер ресурсов, реализовав собственную версию метода __aenter__ magi c и используя AsyncMock для моделирования соответствующих async методов. Проверка концепции, которая проверяет сетевые вызовы, выглядит следующим образом:

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)
...