
moto 5.0 版本起废弃了 `mock_s3` 等服务专属装饰器,统一替换为通用的 `mock_aws` 装饰器,升级后需同步修改导入语句和上下文管理方式。
随着 moto 库在 2024 年发布 v5.0 版本,其 API 进行了重大重构:所有按服务划分的模拟装饰器(如 mock_s3、mock_dynamodb、mock_ec2 等)已被移除,取而代之的是一个统一的 mock_aws 装饰器。该设计简化了多服务协同测试的写法,并提升了内部一致性。
✅ 正确写法(适配 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() 默认启用所有 AWS 服务的模拟(惰性加载),但仅对实际调用的服务初始化资源,性能无显著影响;
- 若你仅需 S3 模拟以提升启动速度或避免干扰,可显式指定服务:with mock_aws(['s3']):;
- 确保已升级至最新稳定版:pip install --upgrade moto;
- 旧版代码(v4.x)中 @mock_s3 装饰器、mock_s3() 函数调用等均不再可用,必须迁移;
- boto3 客户端/资源创建时无需再传入 endpoint_url(除非你主动启用了 mock_aws().start() 手动模式)。
? 小贴士:若项目中同时使用多个 AWS 服务(如 S3 + SQS + Lambda),mock_aws() 可天然支持跨服务交互,例如 S3 事件触发 SQS 消息——这正是新版设计的核心优势之一。
请务必查阅 moto 官方变更日志 获取完整迁移指南与弃用清单。










