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,())