FastAPI: невозможно использовать AsyncMock для извлечения фиктивных строк из aiosqlite (библиотека async sqlite3) при теPython

Программы на Python
Ответить
Anonymous
 FastAPI: невозможно использовать AsyncMock для извлечения фиктивных строк из aiosqlite (библиотека async sqlite3) при те

Сообщение Anonymous »

Я использую Python 3.13.2
Я пробую пример использования AsyncMock для имитации выборки фиктивных строк из БД для проверки моей конечной точки (с использованием pytest-asyncio).
Я также включил в код немакетированную конечную точку, которая у меня работает.
Однако для фиктивной конечной точки у меня становится пусто список.
Пример кода,
# test_main.py
from unittest.mock import AsyncMock, patch
import pytest
from fastapi import FastAPI
from fastapi.testclient import TestClient
import aiosqlite

app = FastAPI()

client = TestClient(app)

@app.get("/users")
async def get_users() -> list[dict[str, int | str]]:
conn = await aiosqlite.connect('test.db')
conn.row_factory = aiosqlite.Row
cursor = await conn.execute('SELECT id, name FROM users')
rows: list[dict[str, str | int]] = []
async for row in cursor:
rows.append(dict(row))
return rows # Getting [{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]

# this test is passing for me
def test_users_no_mock():
expected_data = [{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]
response = client.get('/users')
assert response.status_code == 200
data = response.json()
assert data == expected_data

# this test is failing for me
@pytest.mark.asyncio
async def test_get_users_mock():
expected_data = [{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]
mock_cursor = AsyncMock()

async def async_row_generator():
for row in expected_data:
yield row

mock_cursor.__aiter__.return_value = async_row_generator()

mock_conn = AsyncMock()
mock_conn.execute.return_value = mock_cursor()

with patch('aiosqlite.connect', return_value=mock_conn()):
response = client.get('/users')
data = response.json()
assert response.status_code == 200
assert data == expected_data

Когда я запускаю pytest, я получаю вот что:
============================================================================================ test session starts =============================================================================================
platform darwin -- Python 3.13.2, pytest-9.0.1, pluggy-1.6.0
rootdir: /Users/amit_tendulkar/quest/experiment
plugins: mock-3.15.1, langsmith-0.4.11, anyio-4.10.0, asyncio-1.3.0
asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collected 2 items

test_main.py .F [100%]

================================================================================================== FAILURES ==================================================================================================
____________________________________________________________________________________________ test_get_users_mock _____________________________________________________________________________________________

@pytest.mark.asyncio
async def test_get_users_mock():
expected_data = [{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]
mock_cursor = AsyncMock()

async def async_row_generator():
for row in expected_data:
yield row

mock_cursor.__aiter__.return_value = async_row_generator()

mock_conn = AsyncMock()
mock_conn.execute.return_value = mock_cursor()

with patch('aiosqlite.connect', return_value=mock_conn()):
response = client.get('/users')
data = response.json()
assert response.status_code == 200
> assert data == expected_data
E AssertionError: assert [] == [{'id': 1, 'n...name': 'Bob'}]
E
E Right contains 2 more items, first extra item: {'id': 1, 'name': 'Alice'}
E Use -v to get more diff

test_main.py:46: AssertionError
========================================================================================== short test summary info ===========================================================================================
FAILED test_main.py::test_get_users_mock - AssertionError: assert [] == [{'id': 1, 'n...name': 'Bob'}]
======================================================================================== 1 failed, 1 passed in 0.15s =========================================================================================
:0: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited



Подробнее здесь: https://stackoverflow.com/questions/798 ... async-sqli
Ответить

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

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

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

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

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