Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模拟boto3客户端异常_Python_Mocking_Boto3_Amazon Cognito - Fatal编程技术网

Python 模拟boto3客户端异常

Python 模拟boto3客户端异常,python,mocking,boto3,amazon-cognito,Python,Mocking,Boto3,Amazon Cognito,我试图模拟对boto3.client(“cognito idp”)中函数的调用。 我已经能够成功地模拟正常的代码流,但是异常被证明更加棘手。我有点像: @补丁(“boto3.client”) def test_failure_无法在cognito(self,mock_客户端)中创建_replicate_user_: client=bot3.client(“cognito idp”) boto3_mock=MagicMock() boto3\u mock.admin\u create\u user

我试图模拟对
boto3.client(“cognito idp”)
中函数的调用。 我已经能够成功地模拟正常的代码流,但是异常被证明更加棘手。我有点像:

@补丁(“boto3.client”)
def test_failure_无法在cognito(self,mock_客户端)中创建_replicate_user_:
client=bot3.client(“cognito idp”)
boto3_mock=MagicMock()
boto3\u mock.admin\u create\u user.side\u effect=client.exceptions.UsernameExistsException()
mock\u client.return\u value=boto3\u mock
响应=处理程序(事件,无)
body=json.load(响应[“body”])
self.assertEqual(HTTPStatus.CONFLICT,response[“statusCode”])
然后在处理程序中:

client = boto3.client("cognito-idp")
try:
    create_user_response = client.admin_create_user(
      UserPoolId=user_pool,
      Username=user_name,
      UserAttributes=[
        {
           "Name": user_attribute,
           "Value": user_name
        },
        {
            "Name": verify,
            "Value": "True"
        },
      ],
      TemporaryPassword=temp_pass,
            DesiredDeliveryMediums=[delivery],
    )
    cognito_user_name = create_user_response["User"]["Username"]
except client.exceptions.UsernameExistsException:
   return conflict(Errors.DUPLICATE_USER)
除外
未处理异常。

除此之外,还可以通过使用从模拟boto3函数引发特定boto3异常

在继续之前,请注意,这不是一个好选项,因为它通常需要
~/.aws/
配置文件才能存在,而且它们通常不存在于CI(持续集成)环境中

下面是一个使用上述方法的
boto3.client('glue')
的示例。它可以适用于其他AWS服务和例外情况

功能:

def sure_crawler(**kwargs:Any)->无:
客户机=bot3.客户机(“胶水”)
尝试:
响应=客户端。创建爬虫(**kwargs)
除client.exceptions.alreadyexistException外:
响应=客户端更新爬虫(**kwargs)
断言响应[“ResponseMetadata”][“HTTPStatusCode”]==200
测试:

导入botocore.errorfactory
导入botocore.session
_GLUE\u MODEL=botocore.session.get\u session().get\u service\u MODEL(“GLUE”)
_GLUE_FACTORY=botocore.errorfactory.ClientExceptionsFactory()
_GLUE\u EXCEPTIONS=\u GLUE\u工厂。创建\u客户端\u异常(\u GLUE\u模型)
类TestEnsureCrawler(unittest.TestCase):
def设置(自身)->无:
self.crawler=“abc crawler”
self.mock_boto3_client=补丁(“boto3.client”).start()
def测试_创建_爬虫程序(自身):
self.mock_boto3_client.return_value.create_crawler.return_value={“ResponseMetadata”:{“HTTPStatusCode”:200}
kwargs=dict(Name=self.crawler,Targets={“S3Targets”:[{“Path”:“s3://foo/bar”}]})
确保履带式起重机(**kwargs)
self.mock\u boto3\u client.return\u value.create\u crawler.assert\u called\u once()
call_args=self.mock_boto3_client.return_value.create_crawler.call_args
self.assertEqual(调用_args.args,())
self.assertLessEqual(kwargs.items(),call_args.kwargs.items())
def测试更新爬虫程序(自身):
self.mock\u boto3\u client.return\u value.exceptions.AlreadyExistsException=\u GLUE\u exceptions.AlreadyExistsException
self.mock\u boto3\u client.return\u value.create\u crawler.side\u effect=\u GLUE\u EXCEPTIONS.AlreadyExistsException({},”)
self.mock_boto3_client.return_value.update_crawler.return_value={“ResponseMetadata”:{“HTTPStatusCode”:200}
kwargs=dict(Name=self.crawler,Targets={“S3Targets”:[{“Path”:“s3://foo/bar”}]})
确保履带式起重机(**kwargs)
self.mock\u boto3\u client.return\u value.update\u crawler.assert\u called\u once()
call\u args=self.mock\u boto3\u client.return\u value.update\u crawler.call\u args
self.assertEqual(调用_args.args,())
self.assertLessEqual(kwargs.items(),call_args.kwargs.items())
除此之外,还可以通过使用从模拟boto3函数引发特定boto3异常

在继续之前,请注意,这不是一个好选项,因为它通常需要
~/.aws/
配置文件才能存在,而且它们通常不存在于CI(持续集成)环境中

下面是一个使用上述方法的
boto3.client('glue')
的示例。它可以适用于其他AWS服务和例外情况

功能:

def sure_crawler(**kwargs:Any)->无:
客户机=bot3.客户机(“胶水”)
尝试:
响应=客户端。创建爬虫(**kwargs)
除client.exceptions.alreadyexistException外:
响应=客户端更新爬虫(**kwargs)
断言响应[“ResponseMetadata”][“HTTPStatusCode”]==200
测试:

导入botocore.errorfactory
导入botocore.session
_GLUE\u MODEL=botocore.session.get\u session().get\u service\u MODEL(“GLUE”)
_GLUE_FACTORY=botocore.errorfactory.ClientExceptionsFactory()
_GLUE\u EXCEPTIONS=\u GLUE\u工厂。创建\u客户端\u异常(\u GLUE\u模型)
类TestEnsureCrawler(unittest.TestCase):
def设置(自身)->无:
self.crawler=“abc crawler”
self.mock_boto3_client=补丁(“boto3.client”).start()
def测试_创建_爬虫程序(自身):
self.mock_boto3_client.return_value.create_crawler.return_value={“ResponseMetadata”:{“HTTPStatusCode”:200}
kwargs=dict(Name=self.crawler,Targets={“S3Targets”:[{“Path”:“s3://foo/bar”}]})
确保履带式起重机(**kwargs)
self.mock\u boto3\u client.return\u value.create\u crawler.assert\u called\u once()
call_args=self.mock_boto3_client.return_value.create_crawler.call_args
self.assertEqual(调用_args.args,())
self.assertLessEqual(kwargs.items(),call_args.kwargs.items())
def测试更新爬虫程序(自身):
self.mock\u boto3\u client.return\u value.exceptions.AlreadyExistsException=\u GLUE\u exceptions.AlreadyExistsException
self.mock\u boto3\u client.return\u value.create\u crawler.side\u effect=\u GLUE\u EXCEPTIONS.AlreadyExistsException({},”)
self.mock_boto3_client.return_value.update_crawler.return_value={“ResponseMetadata”:{“HTTPStatusCode”:200}
kwargs=dict(Name=self.crawler,Targets={“S3Targets”:[{“Path”:“s3://foo/bar”}]})
确保履带式起重机(**kwargs)
self.mock\u boto3\u client.return\u value.update\u crawler.assert\u called\u once()
call\u args=self.mock\u boto3\u client.return\u value.update\u crawler.call\u args
self.assertEqual(调用_args.args,())