FastAPI测试报错AttributeError:async_generator无add属性求助
问题分析与解决方案
你遇到的AttributeError: 'async_generator' object has no attribute 'add',本质是测试时注入的不是实际的数据库会话实例,而是异步生成器对象——生成器本身没有ORM会话的add方法,自然报错。下面是针对性的解决步骤:
1. 修正依赖覆盖的方式
生产环境的数据库依赖通常是异步生成器结构,比如:
# 生产环境的数据库依赖 async def get_db(): async with AsyncSessionLocal() as session: yield session
测试时,你需要定义结构完全一致的测试依赖,再通过FastAPI的dependency_overrides替换,注意必须传递可调用的生成器函数,而非直接调用函数得到生成器对象:
# 测试用的数据库会话生成器 async def override_get_db(): # 替换为测试数据库的会话工厂 async with TestAsyncSessionLocal() as session: # 可选:测试前初始化表结构 await create_test_tables() yield session # 可选:测试后清理数据/回滚 await session.rollback() # 在测试初始化中替换依赖 def get_test_client(app): client = TestClient(app) app.dependency_overrides[get_db] = override_get_db return client
2. 规范pytest异步fixture的使用
如果用pytest fixture提供数据库会话,确保fixture正确返回会话实例,且测试函数为异步类型:
@pytest.fixture(scope="function") async def db_session(): async with TestAsyncSessionLocal() as session: await session.begin() yield session await session.rollback() # 必须用async def定义测试函数 async def test_create_item(db_session, client): # 这里db_session是实际的ORM会话实例,可直接调用add方法 new_item = Item(name="test_item") db_session.add(new_item) await db_session.commit() # 调用API端点验证 response = client.post("/items/", json={"name": "test_item"}) assert response.status_code == 200
pytest-asyncio插件会自动解析异步生成器fixture,直接返回yield的会话实例,无需手动调用__anext__。
3. 避免同步上下文使用异步生成器
如果你的测试函数是同步的(用def定义),但依赖异步生成器,就会直接拿到生成器对象而非实例。必须确保测试函数为async def,且安装并启用pytest-asyncio插件。
常见错误示例
- 错误写法:直接将fixture调用结果赋值给依赖覆盖
# 错误:test_db()返回的是异步生成器对象 app.dependency_overrides[get_db] = test_db()
- 正确写法:传递生成器函数本身
app.dependency_overrides[get_db] = test_db # 不要加括号
内容的提问来源于stack exchange,提问作者monopoly
相关产品推荐
相关产品推荐

