ложный ответ boto3 для скачивания файла с S3 - PullRequest
2 голосов
/ 25 октября 2019

У меня есть код, который загружает файл из корзины S3, используя boto3 .

# foo.py
def dl(src_f, dest_f):
  s3 = boto3.resource('s3')
  s3.Bucket('mybucket').download_file(src_f, dest_f)

Теперь я хотел бы написать модульный тест для dl() с использованием pytestи издеваясь над взаимодействием с AWS, используя заглушку, доступную в botocore .

@pytest.fixture
def s3_client():
    yield boto3.client("s3")

from foo import dl
def test_dl(s3_client):

  with Stubber(s3_client) as stubber:
    params = {"Bucket": ANY, "Key": ANY}
    response = {"Body": "lorem"}
    stubber.add_response(SOME_OBJ, response, params)
    dl('bucket_file.txt', 'tmp/bucket_file.txt')
    assert os.path.isfile('tmp/bucket_file.txt')

Я не уверен в правильном подходе для этого. Как мне добавить bucket_file.txt к ответу на заглушку? Какой объект мне нужно add_response() до (показано как SOME_OBJ)?

1 Ответ

2 голосов
/ 25 октября 2019

Рассматривали ли вы использование moto3 ?
Ваш код может выглядеть так же, как и сейчас:

# foo.py
def dl(src_f, dest_f):
  s3 = boto3.resource('s3')
  s3.Bucket('mybucket').download_file(src_f, dest_f)

и тест:

import boto3
import os
from moto import mock_s3

@mock_s3
def test_dl():
    s3 = boto3.client('s3', region_name='us-east-1')
    # We need to create the bucket since this is all in Moto's 'virtual' AWS account
    s3.create_bucket(Bucket='mybucket')

    s3.put_object(Bucket='mybucket', Key= 'bucket_file.txt', Body='')
    dl('bucket_file.txt', 'bucket_file.txt')

    assert os.path.isfile('bucket_file.txt')

Намерение кода становится немного более очевидным, поскольку вы просто в значительной степени работаете с s3 как обычно, за исключением того, что за вызовами метода нет реального s3.

...