如何在模拟对象会话中执行除块内函数

2024-09-27 21:32:58 发布

您现在位置:Python中文网/ 问答频道 /正文

与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

我试着用一个mock对象来做,比如:

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\函数\配置是设计用来触发所需的ClientError的,但是如果我正确地使用了副作用,那就不重要了,对吧?你知道吗

正如您可能知道的,我对使用mock库和测试异常还比较陌生。我已经阅读了尽可能多的例子,并试图以此作为我的评价标准:https://realpython.com/python-mock-library/#patch

但我已经被困了好几天了。如何调用process函数,并以触发我试图设置的副作用ClientError的方式调用?到目前为止(我想)最接近的方法是通过类直接调用它,比如:

LambdaModifyVpcSecurityGroups.process(self,functions)

然后函数运行,但在第一行失败,出现以下错误:

AttributeError: 'TestModifyVpcSecurityGroupsAction' object has no attribute 'manager'

我需要手动设置manager属性吗?我也试过这么做,但没有得到更好的结果,但可能做错了。你知道吗

谢谢你的帮助,抱歉邮件太长。你知道吗


Tags: lambda函数selfclientsessionlocalupdatefunction

热门问题