monkeypatching вызов boto3 s3 в pytest

#python #python-3.x #amazon-web-services #pytest #monkeypatching

#python #python-3.x #amazon-веб-сервисы #pytest #monkeypatching

Вопрос:

Я хочу протестировать функцию save_doc с помощью pytest и имитировать приведенный ниже вызов

     boto3.resource('s3').Object(bucket_name, key).put(Body=json.dumps(body))
  

Я пытаюсь выяснить, как я могу использовать декоратор «patch» для моделирования этого вызова. Есть ли какие-либо примеры / указатели, на которые я могу посмотреть?

 def save_doc(doc_id, body):

    bucket_name = os.environ['bucket_name']
    key = '{}{}.json'.format(os.environ['key'], doc_id)

    boto3.resource('s3').Object(bucket_name, key).put(Body=json.dumps(body))
  

Комментарии:

1. Пакет Moto, похоже, хорошо подходит для этого варианта использования — github.com/spulec/moto

Ответ №1:

Приведенный ниже тестовый пример работает для сценария, опубликованного в вопросах

 @mock_s3
def test_save_doc(doc_id, body):
    bucket_name = os.environ['bucket_name']
    key = os.environ['key']
    conn = boto3.resource('s3', region_name='us-east-1')
    conn.create_bucket(Bucket=bucket_name)
    save_doc(doc_id, body)
    response = conn.Object(bucket_name, key).get()['Body'].read().decode("utf-8")
    assert body == response