Moto 5.0 升级后 mock_s3 已弃用,需统一使用 mock_aws

moto 5.0 版本起废弃了 `mock_s3` 等专用模拟器装饰器,适配所有 aws 服务(如 s3、dynamodb、sqs 等),升级后需同步修改导入和使用方式。

随着 moto v5.0 的发布,项目对 API 进行了重大重构:所有按服务划分的模拟装饰器(如 mock_s3、mock_dynamodb、mock_sqs)已被移除,统一替换为一个通用装饰器 —— mock_aws。该设计不仅简化了接口,还增强了跨服务协同测试的能力(例如在 S3 中触发 Lambda、或在 SQS 中接收 S3 事件)。

✅ 正确写法(适配 moto ≥ 5.0):

import pytest
import os
import boto3
from moto import mock_aws  # ✅ 替换为 mock_aws


@pytest.fixture(scope="module")
def s3():
    with mock_aws():  # ✅ 使用 mock_aws() 上下文管理器
        os.environ["AWS_ACCESS_KEY_ID"] = "test"
        os.environ["AWS_SECRET_ACCESS_KEY"] = "test"
        os.environ["AWS_DEFAULT_REGION"] = "us-east-1"
        s3_resource = boto3.resource("s3", region_name="us-east-1")
        s3_resource.create_bucket(Bucket="test_bucket")
        yield s3_resource

⚠️ 注意事项:

  • mock_aws() 是全服务模拟开关,启用后自动支持 S3、EC2、Lambda 等所有 moto 支持的服务;无需额外导入或嵌套多个 mock。
  • 若你仅需 S3 测试,mock_aws() 不会带来性能负担 —— moto 采用懒加载机制,仅在首次调用对应服务客户端时初始化。
  • 若项目中混用了旧版(如 @mock_s3 装饰器函数),请一并替换,否则将触发 ImportError 或运行时异常。
  • 建议在 pytest 配置中检查 moto 版本:pip show moto,确认为 5.0.0+;若需临时兼容旧代码,可降级(不推荐):pip install "moto

? 小技巧:mock_aws() 支持参数化启用子服务(实验性),例如 mock_aws(["s3", "sns"]) 可显式限定启用范围(详见 moto 文档),但通常默认全启用已足够稳健。

升级后,你的测试逻辑保持不变,只需一次导入调整,即可获得更一致、更可扩展的本地 AWS 模拟体验。