与AWS相关,但不确定这有多重要。我正在尝试编写一个在此函数内(在此类内)执行except
块的单元测试:
class LambdaModifyVpcSecurityGroups(ModifyVpcSecurityGroupsAction):
permissions = ("lambda:UpdateFunctionConfiguration",)
def process(self, functions):
client = local_session(self.manager.session_factory).client('lambda')
groups = super(LambdaModifyVpcSecurityGroups, self).get_groups(
functions)
for idx, i in enumerate(functions):
try:
client.update_function_configuration(FunctionName=i['FunctionName'],
VpcConfig={'SecurityGroupIds': groups[idx]})
except ClientError as e:
if e.response['Error']['Code'] == "ResourceNotFoundException":
continue
raise
我正在尝试使用模拟对象来做到这一点,就像这样:
class TestModifyVpcSecurityGroupsAction(BaseTest):
def test_lambda_notfound_exception(self):
with patch("c7n.resources.awslambda.local_session") as mock_local_session:
mock_local_session.return_value.client.return_value.update_function_configuration.side_effect = ClientError
with self.assertRaises(ClientError):
groups = ['sg-12121212', 'sg-34343434']
mock_local_session.client.update_function_configuration(
FunctionName='badname', VpcConfig={'SecurityGroupIds': groups})
mock_local_session.client.update_function_configuration.assert_called_once()
传递给client.update_function_configuration的参数旨在触发所需的ClientError,但这与我是否正确使用side_effect无关紧要,对吧?
您可能会说,我是第一次使用模拟库并测试异常。我一直在阅读尽可能多的示例,并尝试将其用作我的标题:https://realpython.com/python-mock-library/#patch
但是我已经被困了好几天了。如何调用process
函数,并以某种方式触发我要设置的side_effect ClientError?我认为到目前为止,最接近的方法是直接通过类似这样的类调用它:
LambdaModifyVpcSecurityGroups.process(self,functions)
然后该函数运行,但在第一行失败并出现以下错误:
AttributeError: 'TestModifyVpcSecurityGroupsAction' object has no attribute 'manager'
我需要手动设置manager属性吗?我也尝试这样做,但没有得到更好的结果,但是可能做错了。
感谢您的帮助,对于冗长的帖子深表歉意。