【发布时间】:2022-01-10 22:30:55
【问题描述】:
我想从 S3 存储桶上的特定目录中获取所有档案,如下所示:
def get_files_from_s3(bucket_name, s3_prefix):
files = []
s3_resource = boto3.resource("s3")
bucket = s3_resource.Bucket(bucket_name)
response = bucket.objects.filter(Prefix=s3_prefix)
for obj in response:
if obj.key.endswidth('.zip'):
# get all archives
files.append(obj.key)
return files
我的问题是关于测试它;因为我想模拟response 中的对象列表以便能够对其进行迭代。这是我尝试过的:
from unittest.mock import patch
from dataclasses import dataclass
@dataclass
class MockZip:
key = 'file.zip'
@patch('module.boto3')
def test_get_files_from_s3(self, mock_boto3):
bucket = mock_boto3.resource('s3').Bucket(self.bucket_name)
response = bucket.objects.filter(Prefix=S3_PREFIX)
response.return_value = [MockZip()]
files = module.get_files_from_s3(BUCKET_NAME, S3_PREFIX)
self.assertEqual(['file.zip'], files)
我收到这样的断言错误:E AssertionError: ['file.zip'] != []
有人有更好的方法吗?我使用了 struct 但我不认为这是问题所在,我想我得到一个空列表,因为 response 不可迭代。那么如何将其模拟为模拟对象列表而不仅仅是 MockMagick 类型?
谢谢
【问题讨论】:
标签: python unit-testing amazon-s3 mocking boto3