当前从Moto中获取SESBackend对象的正确方法是什么?
如何更简洁地访问Moto的SESBackend对象?
我需要访问Moto的mock_ses库背后的SESBackend对象,用来检查发送的邮件是否具备正确属性。但Moto的SES文档只展示了基础的装饰器包裹语法。
我已经有可运行的实现,但感觉太繁琐,肯定有更优方案:
import pytest import boto3 from moto import mock_ses from moto.core.utils import AccountSpecificBackend from moto.ses.models import SESBackend # ************************************** # *** Is this code really necessary? *** # ************************************** def get_ses_backend(ses_object) -> SESBackend: for key, value in ses_object.backends.items(): if isinstance(value, AccountSpecificBackend): return value['global'] def test_my_email_function(): with mock_ses() as ses_object: ses_conn = boto3.client("ses", region_name='eu-west-2') backend = get_ses_backend(ses_object) # 执行邮件发送逻辑... assert len(backend.sent_messages) == 1
优化方案(针对Moto 4.0.1版本)
你写的遍历函数完全可以省去,Moto提供了更直接的方式获取SESBackend:
方式一:通过mock实例直接获取
利用Moto默认的AWS测试账户ID(123456789012)和SES的全局服务特性,直接从mock对象的backends字典取值:
import pytest import boto3 from moto import mock_ses from moto.ses.models import SESBackend def test_my_email_function(): with mock_ses() as ses_object: ses_conn = boto3.client("ses", region_name='eu-west-2') # 直接获取默认账户的全局SES后端 backend = ses_object.backends["123456789012"]["global"] # 执行邮件发送逻辑... assert len(backend.sent_messages) == 1
方式二:导入全局后端字典
Moto会维护一个全局的ses_backends字典,直接导入后即可获取目标实例:
import pytest import boto3 from moto import mock_ses from moto.ses.models import ses_backends def test_my_email_function(): with mock_ses(): ses_conn = boto3.client("ses", region_name='eu-west-2') # 从全局后端字典获取默认账户的实例 backend = ses_backends["123456789012"]["global"] # 执行邮件发送逻辑... assert len(backend.sent_messages) == 1
说明
- Moto默认使用的测试账户ID是
123456789012,如果你的测试使用了自定义账户ID,替换掉这个值即可。 - SES是AWS全局服务,所以对应的区域键固定为
global,不用指定具体地区。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

