Протестируйте AWS s3 PUT и загрузите в Pytest - PullRequest
0 голосов
/ 29 января 2019

У меня есть следующая функция.

def test_download(test_args):
    mock = mock_s3()
    mock.start()
    conn = boto3.resource('s3', region_name='us-west-2')
    conn.create_bucket(Bucket=test_args.source_bucket)
    s3.Object(test_args.source_bucket, 'testing.txt').put(
        Body=open("testing.txt", 'rb'))
    handler_client = HandlerClient(test_args)
    handler_client.get_s3_file()

Использование from moto import mock_s3

Я получаю ошибку, когда иду на тестирование.

    def add_auth(self, request):
        if self.credentials is None:
>           raise NoCredentialsError
E           botocore.exceptions.NoCredentialsError: Unable to locate credentials at line
>       `conn.create_bucket(Bucket=test_args.source_bucket)`

Я пыталсяс декоратором, а также

with moto.mock_s3():

Все получают ту же ошибку.Как я могу решить эту проблему, чтобы создать поддельное ведро и бросить в него предмет.

1 Ответ

0 голосов
/ 29 января 2019

moto к сожалению, не высмеивает части авторизации boto3.Поэтому вам необходимо настроить некоторую часть цепочки авторизации AWS, например, экспортировать AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY.Обычно мы настраиваем прибор для обновления среды перед каждым тестом:

@pytest.fixture(scope='function')
def context():
    context = attrdict.AttrMap()
    orig_env = os.environ.copy()
    os.environ['AWS_ACCESS_KEY_ID'] = 'foo'
    os.environ['AWS_SECRET_ACCESS_KEY'] = 'bar'
    context.os = {'environ': os.environ}
    yield context
    os.environ = orig_env

Импортируемая часть устанавливает AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, затем yield ing, затем восстанавливает os.environ обратнов исходное состояние.Вам не нужно использовать часть context = attrdict.AttrMap, нам это нравится, поэтому тестовые функции, использующие этот прибор, имеют доступ к атрибутам теста os.environ (и другим тестам).

...