TypeError:对象 AsyncMock 不能在“await”表达式中使用

问题描述 投票:0回答:1

我为一个函数创建了一个 pytest,但是当我尝试运行它时出现以下错误:

>           return await cntrl.get_function_by_topic_by_method(url, method, *args, query_params=query_params, action=action, **kwargs)
E           TypeError: object AsyncMock can't be used in 'await' expression

我很困惑为什么会发生这种情况,因为只能等待异步函数,而且由于我使用了 AsyncMock() 它应该可以工作。

该函数在下面提到,它位于

app/folder_market/controller/DQR.py

import traceback
import logging
import httpx
from .utils.ApiHelper import ApiHelper

logger = logging.getLogger(__name__)

class DQR(object):
   
    def __init__(self, config, *args, **kwargs):
        self.methods = ['GET', 'PUT']
        self.config = config
        self.args = args
        self.kwargs = kwargs
        self.cai_usage = config['cai_usage']
        self.topic = "DQR"

    async def retrieve_something(self, *args, query_params=None, **kwargs):
        try:
            action = 'retrievSomething'
            cntrl = ApiHelper(self.config)
            url, method = cntrl.get_url_and_method(self.topic, action=action)
            return await cntrl.get_function_by_topic_by_method(url, method, *args, query_params=query_params, action=action, **kwargs)
        except (httpx.RequestError, httpx.TimeoutException, httpx.ConnectError, httpx.NetworkError, httpx.TransportError) as error:
            # Log the full exception traceback for debugging
            traceback.print_exc()
            msg = "Error in " + __name__ + ", retrieve_data_collection_requests: " + str(error)
            print(msg)
            logger.error(msg)

函数的测试位于

app/tests/controller/test_DQR.py

from unittest.mock import AsyncMock
import os
import sys
import pytest
sys.path.insert(0, os.path.abspath("."))
from folder_market.controller.DQR import DQR
from folder_market.utils.ConfigHelper import load_config
from folder_market.controller.utils.ConfigHelper import config_validator
from pytest_mock import MockerFixture

config = load_config('marketplace/config.yaml')
config_validator(config)


instance_data_collection = DQR(config=config)

# Helper function to assert response data
def assert_response_data(response_data):
    assert len(response_data['objects']) > 1
    assert all(item.get('id') for item in response_data['objects'])


@pytest.mark.asyncio
async def test_retrieve_something_param_id_success(mocker: MockerFixture):
    
    # Create a mock of the 'ApiHelper' instance
    mock_api_helper = mocker.patch(
        "folder_market.controller.DQR.ApiHelper"
    )     
    api_helper_instance = mock_api_helper.return_value
    api_helper_instance.get_url_and_method.return_value = ("https://mocked-api-url", "GET")

    expected_response_data = {
    "processingTime": 486,
    "offset": 0,
    "limit": 50,
    "totalCount": 1,
    "objects": [
        {
        "id": "407225ad-7870-4678-8169-43829d80c4bc",
        "refId": "d90574a4-417d-4c34-b9f1-4f2da5fc997a"
    }]}
    
    mock_http_client = AsyncMock()
    mock_http_client.get.return_value.status_code = 200
    mock_http_client.get.return_value.json.return_value = expected_response_data


    api_helper_instance.get_function_by_topic_by_method.return_value = mock_http_client

    requestId = "407225ad-7870-4678-8169-43829d80c4bc"
    get_data_collection_request = await instance_data_collection.retrieve_data_collection_requests(query_params={"requestIds": requestId})

    assert get_data_collection_request.status_code == 200
    response_data = get_data_collection_request.json()
    assert_response_data(response_data)
    assert response_data['objects'][0]['id'] == requestId
python asynchronous async-await python-asyncio
1个回答
0
投票

尝试

from asyncio import Future
future = Future()
future.set_result(some_result) 
api_helper_instance.get_function_by_topic_by_method.return_value = future
© www.soinside.com 2019 - 2024. All rights reserved.