如何在模拟对象会话中执行内部功能块以外的块

时间:2019-07-19 22:24:03

标签: python mocking

与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属性吗?我也尝试这样做,但没有得到更好的结果,但是可能做错了。

感谢您的帮助,对于冗长的帖子深表歉意。

0 个答案:

没有答案