python - 模拟boto3 S3客户端方法Python

标签 python mocking boto boto3 botocore

我正在尝试从 boto3 s3 客户端对象模拟一个单一方法以引发异常。但我需要所有其他方法才能让这个类正常工作。

这样我就可以在执行 upload_part_copy 时发生错误时测试单个异常测试。

第一次尝试

import boto3
from mock import patch

with patch('botocore.client.S3.upload_part_copy', side_effect=Exception('Error Uploading')) as mock:
    client = boto3.client('s3')
    # Should return actual result
    o = client.get_object(Bucket='my-bucket', Key='my-key')
    # Should return mocked exception
    e = client.upload_part_copy()

但是这会产生以下错误:

ImportError: No module named S3

第二次尝试

查看botocore.client.py源代码后发现它做的很聪明,方法upload_part_copy不存在。我发现它似乎调用了 BaseClient._make_api_call 所以我试图模拟它

import boto3
from mock import patch

with patch('botocore.client.BaseClient._make_api_call', side_effect=Exception('Error Uploading')) as mock:
    client = boto3.client('s3')
    # Should return actual result
    o = client.get_object(Bucket='my-bucket', Key='my-key')
    # Should return mocked exception
    e = client.upload_part_copy()

这会引发异常...但是在我想避免的 get_object 上。

关于我如何只能在 upload_part_copy 方法上抛出异常的任何想法?

最佳答案

Botocore 有一个可以用于此目的的客户端 stub :docs .

下面是一个错误的例子:

import boto3
from botocore.stub import Stubber

client = boto3.client('s3')
stubber = Stubber(client)
stubber.add_client_error('upload_part_copy')
stubber.activate()

# Will raise a ClientError
client.upload_part_copy()

这是一个放入正常响应的示例。此外, stub 现在可以在上下文中使用。重要的是要注意, stub 程序将尽可能验证您提供的响应是否与服务实际返回的内容相匹配。这并不完美,但它可以保护您免于插入完全无意义的响应。

import boto3
from botocore.stub import Stubber

client = boto3.client('s3')
stubber = Stubber(client)
list_buckets_response = {
    "Owner": {
        "DisplayName": "name",
        "ID": "EXAMPLE123"
    },
    "Buckets": [{
        "CreationDate": "2016-05-25T16:55:48.000Z",
        "Name": "foo"
    }]
}
expected_params = {}
stubber.add_response('list_buckets', list_buckets_response, expected_params)

with stubber:
    response = client.list_buckets()

assert response == list_buckets_response

关于python - 模拟boto3 S3客户端方法Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37143597/

相关文章:

python - 在 Amazon 中处理消息

python - GAE : python code to check if i'm on dev_appserver or deployed to appspot

python - 使用相似矩阵的 sklearn 层次凝聚聚类

java - JMockit:如何根据构造函数中给出的参数来模拟方法?

service - Karma/Jasmine 使用依赖项对 AngularJS 服务进行单元测试

python - 更新 s3 中的元数据

python - 如何设置守护进程在其死亡时杀死其进程组中的其他进程

python - FeinCMS 页面迁移不起作用

java - 用其他方法模拟一个方法

asynchronous - 在 s3 中传输数据的有效方法