Задать вопрос
@kicherov_maxim

Как использовать AsyncMock?

Добрый день. У меня есть класс, для работы с базой данных Я бы хотел реализовать тесты для него, хочу использовать AsyncMock и проверять как он был вызван с какими параметрами. Я получаю ошибку AttributeError: 'coroutine' object has no attribute 'objects'
class SyncDB(Actor):
    category: ACTORS
    database: BaseDBQuery
    control: t.Any

    def __init__(self, category: ACTORS, control: t.Any, database: BaseDBQuery) -> None:
        self.category = category
        self.database = database()
        self.control = control()
        super().__init__()

    async def __call__(self) -> None:
        for model in await self.control.objects(state=True):
            if not model.oid:
                result = self.database.create(
                    json=json.dumps(model.as_dict())
                )
                create_rows_count += result.status
               ...

тест
@mark.asyncio
async def test_sync_bank(bank):
    mock_bank_control = AsyncMock()
    mock_bank_control.objects = AsyncMock(return_value=[bank])
    mock_bank_db = AsyncMock(BankDB)
    actor = SyncDB(ACTORS.SYNC_BANK, control=mock_bank_control, database=mock_bank_db)
    await actor.__call__()
  • Вопрос задан
  • 478 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
Tomio
@Tomio
backend developer (python, php)
Такая ошибка "AttributeError: 'coroutine' object has no attribute 'objects'" говорит о том, что вы пытаетесь получить и одновременно присвоить атрибут objects для объекта корутины. С ними такое не прокатывает) Вам нужно "выполнить" (то есть, применить ключевое слово await) корутину (сопрограмму) и получить уже какой-то ответ.
Скорее всего, в вашем случае нужно написать как-то так:
mock_bank_control = AsyncMock()
objects = await mock_bank_control(return_value=[bank])
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы