Макет: у клиента нет атрибута get_object - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь исправить метод S3 get_object из модуля boto3, но продолжаю получать следующую ошибку

AttributeError: <function client at 0x104570200> does not have the attribute 'get_object'

Это сбивает с толку, потому что я могу успешно исправить boto3.client, но не boto3.client.get_object, хотя в документации boto3 говорится, что это один из методов для клиента

Вот мой код

import boto3
from mock import patch

@pytest.mark.parametrize(
    'response, expected',
    [
        (200, True),
        (400,False)
    ]
)

@patch('boto3.client.get_object')
def test_get_file(mock, response, expected):
    mock.return_values = response
    test = get_file('portfolio/test.xls')
    assert test == expected

def get_file(self, key):
    S3 = boto3.client('s3')
    response = S3.get_object(bucket='portfolios', key=key)
    if response.status == 200:
        return response

    return False

1 Ответ

1 голос
/ 28 апреля 2020

Вместо этого попробуйте смоделировать botocore.client.BaseClient._make_api_call.

Клиенты Boto3 создаются во время выполнения, поэтому их методы и атрибуты зависят от имени службы. Базовый «тупой» клиент, скорее всего, не имеет этого метода.

def mock_client(self, operation_name, kwarg) -> dict:
    if operation_name == "GetObject":
        # do the thing

...

@mock.patch('botocore.client.BaseClient._make_api_call', new=mock_client)
def test_your_stuff():
    # do the test

Также обратите внимание, что вам необходимо знать, каков API-вызов для операции, которую вы хотите использовать.

В качестве альтернативы : используйте moto package , это довольно хорошо для популярных сервисов, таких как S3.

...