如何修补函数以返回嵌套字典

时间:2017-09-25 18:19:08

标签: python mocking

我正在尝试修补函数以返回嵌套字典,如下所示:

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__()次来电,但有没有比假装字典更优雅的解决方案?

1 个答案:

答案 0 :(得分:0)

假设create_platform_endpointget_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_endpointget_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()