首页 > 解决方案 > 如何模拟对 secretsmanager 的 boto3 客户端会话请求以返回特定响应或引发异常

问题描述

给定如下代码:

def do_stuff():

    session = boto3.session.Session()
    client = session.client(service_name="secretsmanager", region_name=region_name)
    client.get_secret_value(SecretId=sendgrid_api_key_arn)

我如何模拟 client.get_secret_value("some-value")返回一些值

以及如何模拟它以引发异常

@patch("boto3.session")
def test_get_sendgrid_api_key_secret_when_client_error(mock_session):
        session = mock_session.Session();
        client = session.client()
        client.get_secret_value().return_value = 
                 {"SecretString": "my-secret"} <- this is wrapped in a MagicMock which is useless.

标签: pythonpytestboto3pytest-mock

解决方案


您需要client.get_secret_value通过添加一个装饰器来进行修补。完成此操作后,您可以将 return_value 设置为您需要的异常。

@patch("boto3.session")
@patch("boto3.session.Session.client.get_secret_value")
def test_get_sendgrid_api_key_secret_when_client_error(mock_session,second_fn):
        with pytest.raises('CustomException')
        session = mock_session.Session();
        second_fn.return_value = lambda : Exception('CustomException')
        client = session.client()
        client.get_secret_value()

执行时client.get_secret_value(),测试用例将通过以引发预期的异常。类似地,我们可以分配任何其他值来模拟函数的返回,而不是 lambda。


推荐阅读