我正在尝试修补函数以返回嵌套字典,如下所示:
with patch('boto3.client') as mock:
mock.create_platform_endpoint.return_value = {'EndpointArn': 'another_arn'}
mock.get_endpoint_attributes.return_value = {'Attributes': {'Enabled': 'true', 'Token': 'new_token'}}
device.register_with_aws()
这失败了,因为在访问字典时,代码只找到MogicMock函数,例如<MagicMock name='client().create_platform_endpoint().__getitem__()' id='4619515160'>
或<MagicMock name='client().get_endpoint_attributes().__getitem__().__getitem__()()' id='4424507800'>
我想我可以嘲笑这些__getitem__()
次来电,但有没有比假装字典更优雅的解决方案?
答案 0 :(得分:0)
假设create_platform_endpoint
和get_endpoint_attributes
是类boto3.client
的方法,这可能适合您:
with patch(boto3.client, 'create_platform_endpoint', return_value={'EndpointArn': 'another_arn'}):
with patch(boto3.client, 'get_endpoint_attributes', return_value={'Attributes': {'Enabled': 'true', 'Token': 'new_token'}}):
device.register_with_aws()
假设create_platform_endpoint
和get_endpoint_attributes
是方法boto3.client
的属性,这可能适合您:
with patch('boto3.client.create_platform_endpoint', return_value={'EndpointArn': 'another_arn'}):
with patch('boto3.client.get_endpoint_attributes', return_value={'Attributes': {'Enabled': 'true', 'Token': 'new_token'}}):
device.register_with_aws()
查看patch
here的文档。
很少有其他指示: 如果你班上有类似的东西:
class Foo(object):
...
def bar(self):
...
value = boto3.client() # Assume you are using the method boto3.client() here
...
return whatever # Assume that this is a dictionary you want
现在如果你想要从Foo().bar()
返回的字典修补其他一些返回值,那么这可以帮助你:
with patch.object(Foo, 'bar', return_value={}):
foo()
如果要模拟值Foo().bar().value
,请尝试模拟客户端方法本身
with patch('boto3.client', return_value={}): # This makes the value `value` as {}.
foo()