Проблема, с которой я столкнулся, заключается в том, что когда я вызываю async с session.get в качестве ответа возникает следующее исключение.
TypeError: объект «сопрограмма» не поддерживает протокол асинхронного менеджера контекста.
Вот мой код:
Код: Выделить всё
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 ... xt-manager