Stubber 没有 boto3 属性

Stubber has no boto3 attribute

    self.cf_client = boto3.client('cloudformation')
    self.cf_client_stubber = Stubber(self.cf_client)

    print(f" cc {type(self.cf_client_stubber)}")

    self.cf_client_stubber.add_response("describe_stacks", self.cf_describe_response,
                                        self.cf_describe_params)
    self.cf_client_stubber.activate()

    stackList = self.cf_client_stubber.describe_stacks(StackName=self.cf_stack_name, NextToken='xyz')

   

每当我用 pytest 运行 这个方法时,我都会遇到以下错误:

E           AttributeError: 'Stubber' object has no attribute 'describe_stacks'

python/src/example.py:26: AttributeError

是否知道主要问题是什么?

我找到了解决这个问题的方法。

  1. 调用方法时,不要使用stubber。使用实际的 boto3 客户端。
  2. 将 stubber 方法按照您要测试的方法的顺序排列,如 add_reponse。例如,如果在delete_stack之前调用describe_stacks,则在测试中在delete_stack之前添加describe_stacks;否则找不到方法。

我要添加一个例子,因为接受的答案没有。

来自 docs

请注意使用 s3 客户端而不是 stubber 来发出请求。

service_response = s3.list_objects(Bucket='test-bucket')
import datetime
import botocore.session
from botocore.stub import Stubber


s3 = botocore.session.get_session().create_client('s3')
stubber = Stubber(s3)

response = {
    'IsTruncated': False,
    'Name': 'test-bucket',
    'MaxKeys': 1000, 'Prefix': '',
    'Contents': [{
        'Key': 'test.txt',
        'ETag': '"abc123"',
        'StorageClass': 'STANDARD',
        'LastModified': datetime.datetime(2016, 1, 20, 22, 9),
        'Owner': {'ID': 'abc123', 'DisplayName': 'myname'},
        'Size': 14814
    }],
    'EncodingType': 'url',
    'ResponseMetadata': {
        'RequestId': 'abc123',
        'HTTPStatusCode': 200,
        'HostId': 'abc123'
    },
    'Marker': ''
}

expected_params = {'Bucket': 'test-bucket'}

stubber.add_response('list_objects', response, expected_params)
stubber.activate()

service_response = s3.list_objects(Bucket='test-bucket')
assert service_response == response

如果您尝试使用 stubber 发出请求,您将收到上述错误

AttributeError: 'Stubber' object has no attribute ...