gpt4 book ai didi

python - 如何使用模拟测试 boto3 资源下载文件引发 404 错误?

转载 作者:太空宇宙 更新时间:2023-11-03 14:00:21 25 4
gpt4 key购买 nike

我想测试 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'

我认为运行 download_file 函数时模拟会引发错误。

我发现这里记录了download_file:
http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html#more-info

但在测试中,我无法导入 s3 模块

最佳答案

s3 不是模块,boto3 是。我想做和你一样的事情,模拟 500 响应 botocore.exceptions.ClientError 对象。这是我的做法(我更新了我的代码以匹配您的代码,因为它非常相似):

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 条件👍

关于python - 如何使用模拟测试 boto3 资源下载文件引发 404 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49290392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com