как загрузить файл ресурса boto3 404error test с помощью макета?

Я хочу проверить ресурс s3 download_file :)

вот мой код

def logfile_downloader():
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(bucket)
    for object in bucket.objects.filter(Prefix='logs/access_2018'):
        try:
            bucket.download_file(object.key, 'logs/' + save_path + '/' + object.key.split('/')[-1])
        except botocore.exceptions.ClientError as e:
            if e.response['Error']['Code'] == "404":
                click.echo(click.style("The object does not exist.", bg="white", fg="red"))
            else:
                raise

когда я тестирую с помощью макета python, тест был пройден

@mock.patch('boto3.resource')
    def test_log_downloader(mock_resource):
    logfinder._log_downloader()
    assert mock_resource.called

но охват не 100%, потому что botocore.exceptions.ClientError не тестировался

Итак, я создаю тест

@mock.patch('s3.Bucket.download_file')
def test_log_downloader_404(mock_download_file):
    mock_download_file.return_value = 404
    logfinder.log_downloader()
    assert mock_download_file.called

но это не удалось

ModuleNotFoundError: No module named 's3'

я думаю, что mock вызовет ошибку при запуске функции download_file,

Итак, я нахожу путь к файлу загрузки http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html#more-info

но тест не может импортировать модуль s3

пожалуйста, кто-нибудь, дайте мне несколько советов, спасибо


person Jade Han    schedule 15.03.2018    source источник


Ответы (1)


s3 не модуль, boto3 есть. Я хотел сделать то же, что и вы, издеваясь над объектом botocore.exceptions.ClientError ответа 500. Вот как я это сделал (я обновил свой код, чтобы он соответствовал вашему, так как он был очень похож):

import botocore

def test_log_downloader_500():
    with mock.patch('boto3.s3.transfer.S3Transfer.download_file') as download_file:
        error_response = {'Error': {'Code': '500'}}
        side_effect = botocore.errorfactory.ClientError(error_response, 'unexpected')
        download_file.side_effect = side_effect

        with pytest.raises(botocore.errorfactory.ClientError):
            logfinder.log_downloader()

Это покроет часть else raise. Просто сделайте то же самое для ошибки 404, заменив вышеуказанные значения, и вы закроете условие 404 ????

person GabLeRoux    schedule 15.08.2018