@arkadiy_ksvu
учусь на физтехе

Почему не работает AsyncMock для мокирования асинхронной функции?

@mock.patch('bot.src.telegram_bot.tools.voice_file_tools.delete_voice_message')
@mock.patch('bot.src.telegram_bot.tools.voice_file_tools.save_voice_message')
@mock.patch('bot.src.voice_recognition.chatgpt.openai')
@mock.patch('bot.src.voice_recognition.openai_stt.openai')
@pytest.mark.asyncio
async def test_voice_message_handler(
    mock_openai_whisper, mock_openai_chatgpt,
    mock_save_voice_message, mock_delete_voice_message
):
    mocked_bot = MockedBot(
        MessageHandler(voice_messages.voice_message_handler)
    )

    with open(
        Path(__file__).parent.resolve() / 'test_whisper_response.json',
        'r',
        encoding='utf-8',
    ) as file:
        test_whisper_response = json.load(file)
    mock_openai_whisper.Audio.atranscribe.side_effect = (
        mock.AsyncMock(return_value=test_whisper_response))

    with open(
        Path(__file__).parent.resolve() / 'test_chatgpt_response.json',
        'r',
        encoding='utf-8',
    ) as file:
        test_chatgpt_response = json.load(file)
    mock_openai_chatgpt.openai.ChatCompletion.acreate.side_effect = (
        mock.AsyncMock(return_value=test_chatgpt_response))

    mock_save_voice_message.return_value = (
        Path(__file__).parent.resolve() / 'test_voice.ogg'
    )
    mock_delete_voice_message.return_value = None

    sender = await mocked_bot.query(MESSAGE_WITH_VOICE.as_object())
    answer_message = sender.send_message.fetchone().text

    with open(
            Path(__file__).parent.resolve() / 'correct_response.txt',
            'r',
            encoding='utf-8',
    ) as file:
        correct_message = file.read()

    assert answer_message == correct_message


Почему мокирование для mock_openai_whisper.Audio.atranscribe сработало, а для mock_openai_chatgpt.openai.ChatCompletion.acreate нет?
Выдает ошибку

async def send_text_to_post_processing(self, text):
>       result = await openai.ChatCompletion.acreate(
            api_key=self._api_key,
            model=self._model,
            messages=self._create_prompt(text),
        )
E       TypeError: object MagicMock can't be used in 'await' expression
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы