gpt4 book ai didi

python - 如何在另一个因 moto 的模拟而不一定存在的函数中模拟对象的函数调用

转载 作者:行者123 更新时间:2023-12-01 06:36:11 26 4
gpt4 key购买 nike

我有一个名为 check_stuff 的函数,它实例化一个对象并调用函数 describe_continuous_backups,但是,moto 尚不支持此功能,因此我需要自己手动模拟它。我有以下内容,但似乎我无法修补该对象。我该怎么办?

def check_stuff(profile, table_name):
session = boto3.Session(profile_name=profile)
client = session.client('dynamodb', 'eu-west-1')
some_stuff = client.describe_continuous_backups(TableName=table_name)
#dostuff

@mock_dynamodb2
@mock.patch('boto3.Session.client.describe_continuous_backups', return_value={'foo': 'bar'})
def test_continuous_backup_disabled(self):
table = self.client.create_table(
TableName='Movies',
KeySchema=[
{
'AttributeName': 'year',
'KeyType': 'HASH'
},
{
'AttributeName': 'title',
'KeyType': 'RANGE'
}
],
AttributeDefinitions=[
{
'AttributeName': 'year',
'AttributeType': 'N'
},
{
'AttributeName': 'title',
'AttributeType': 'S'
},

],
ProvisionedThroughput={
'ReadCapacityUnits': 10,
'WriteCapacityUnits': 10
}
)
result = check_stuff('myprofile', 'some_table')

我可以尝试像这样 mock 客户端:

mocker.patch('mypackage.boto3.Session.client', ....)

但问题是它会 mock 客户端本身。我需要模拟一个不一定存在的函数,同时保留其余功能。

最佳答案

boto3.client 返回基于 service_name 参数动态创建的类的实例(请参阅 source ),因此您无法使用 patch 方法,该方法要求目标对象可导入。

相反,您可以修补 botocore.client.ClientCreator._create_methods,该方法为 boto3.client 返回的类动态创建方法,并使用一个包装函数使 describe_continuous_backups 属性成为具有给定 return_valueMock 对象:

import boto3
import botocore
from unittest.mock import patch, Mock

def override(*args, **kwargs):
def wrapper(self, service_model):
op_dict = original_create_methods(self, service_model)
if 'describe_continuous_backups' in op_dict:
op_dict['describe_continuous_backups'] = Mock(*args, **kwargs)
return op_dict
return wrapper
original_create_methods = botocore.client.ClientCreator._create_methods

@patch('botocore.client.ClientCreator._create_methods', override(return_value={'foo': 'bar'}))
def check_stuff():
session = boto3.Session()
client = session.client('dynamodb', 'eu-west-1')
some_stuff = client.describe_continuous_backups(TableName='')
return some_stuff

print(check_stuff())

输出:

{'foo': 'bar'}

关于python - 如何在另一个因 moto 的模拟而不一定存在的函数中模拟对象的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59655359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com