[Python] Correct usage of async session on pytest

Discussão em 'Python' iniciado por Stack, Setembro 30, 2024.

  1. Stack

    Stack Membro Participativo

    Given below implementation, I try to test using an asynchronous session. My attempt goes in the following way:

    models.py

    from sqlalchemy.engine import Connection
    from sqlalchemy.ext.asyncio import AsyncConnection

    class Paginator:
    def __init__(
    self,
    conn: Union[Connection, AsyncConnection],
    query: str,
    params: dict = None,
    batch_size: int = 10
    ):
    self.conn = conn
    self.query = query
    self.params = params
    self.batch_size = batch_size
    self.current_offset = 0
    self.total_count = None

    async def _get_total_count_async(self) -> int:
    """Fetch the total count of records asynchronously."""
    count_query = f"SELECT COUNT(*) FROM ({self.query}) as total"
    query=text(count_query).bindparams(**(self.params or {}))
    result = await self.conn.execute(query)
    return result.scalar()


    test_models.py

    @pytest.fixture(scope='function')
    async def async_session():
    async_engine=create_async_engine('postgresql+asyncpg://localhost:5432/db')
    async_session = sessionmaker(
    expire_on_commit=False,
    autocommit=False,
    autoflush=False,
    bind=async_engine,
    class_=AsyncSession,
    )

    async with async_session() as session:
    await session.begin()

    yield session

    await session.rollback()

    @pytest.mark.asyncio
    async def test_get_total_count_async(async_session):
    # Prepare the paginator
    paginator = Paginator(
    conn=session,
    query="SELECT * FROM test_table",
    batch_size=2
    )

    # Perform the total count query asynchronously
    total_count = await paginator._get_total_count_async()

    # Assertion to verify the result
    assert total_count == 0


    When I run the command pytest, I obtained following error: AttributeError: 'async_generator' object has no attribute 'execute'. I am pretty sure, there is an easy way to do so, but I am unaware of it.

    Continue reading...

Compartilhe esta Página