Pytest_asyncio — TypeError: объект «сопрограмма» не поддерживает протокол асинхронного контекстного менеджераPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pytest_asyncio — TypeError: объект «сопрограмма» не поддерживает протокол асинхронного контекстного менеджера

Сообщение Anonymous »

Я пытаюсь провести асинхронное тестирование для класса, который выполняет HTTPS-запрос, используя aiohttp.ClientSession.
Проблема, с которой я столкнулся, заключается в том, что когда я вызываю async с session.get в качестве ответа возникает следующее исключение.

TypeError: объект «coroutine» не поддерживает протокол асинхронного менеджера контекста.

Вот мой код:

Код: Выделить всё

class URLFetcher:
def __init__(self, proxies=None, user_agents=None, rate_limit=1, cache=None, authentication: Authentication = None, session_manager=None):
self.proxies = proxies or []
self.user_agents = user_agents or [self.default_user_agent()]
self.rate_limiter = RateLimiter(rate_limit)
self.authentication = authentication
self.session_manager = session_manager or SessionManager()
self.cache = cache

async def fetch(self, url, retries=3):
cache = await self._pre_flight(url)
if cache:
return cache

try:
async with self.session_manager as session:
async with session.get(
url,
headers=self.headers,
proxy=self.proxy,
timeout=10
) as response:
response.raise_for_status()
content = await response.text()

if self.cache:
self.cache.set(url, content)

return content
except aiohttp.ClientError as e:
logger.error(f"HTTP error for URL {url}: {e}")
if retries > 0:
await asyncio.sleep(2 ** (3 - retries))
return await self.fetch(url, retries - 1)
else:
raise e
Вот тест:

Код: Выделить всё

@pytest_asyncio.fixture
async def url_fetcher():
fetcher = URLFetcher()
yield fetcher
await fetcher.session_manager.close()

@pytest.mark.asyncio
async def test_fetch_success(url_fetcher):
# Mock the response
mock_response = AsyncMock()
mock_response.status = 200
mock_response.text.return_value = 'Mock Content'

# Mock the session.get methods
mock_get = AsyncMock(return_value=mock_response)

# Patch the ClientSession.get method
with patch('aiohttp.ClientSession.get', new=mock_get):
content = await url_fetcher.fetch('http://example.com')

assert content == 'Mock Content'
mock_get.assert_called_once_with(
'http://example.com',
headers=url_fetcher.headers,
proxy=url_fetcher.proxy,
timeout=10
)
Я пытаюсь имитировать асинхронное тестирование для своего класса.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ynchronous
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»