FastAPI异步项目pytest测试报错:'async_generator'无'post'属性
问题原因
你的client异步fixture定义错误,导致注入测试函数的是异步生成器对象,而非AsyncClient实例。
pytest中,异步fixture如果通过yield返回值,且没有正确处理AsyncClient的异步上下文,就会返回生成器对象,而非实际可用的客户端实例——这就是调用client.post()触发AttributeError的核心原因,生成器根本没有这个方法。
而你在测试函数内用async with AsyncClient(...)能正常运行,是因为这种方式正确进入了异步上下文,拿到的是真正的客户端实例。
修复方案
根据是否需要前后置操作,有两种正确的fixture定义方式:
方式1:无前后置逻辑的简单fixture
直接用async with包裹AsyncClient,yield出上下文内的实例:
import pytest from httpx import AsyncClient from main import app @pytest.fixture async def client(): async with AsyncClient(app=app, base_url="http://test") as ac: yield ac
方式2:含前后置逻辑的fixture
如果需要在测试前后执行初始化/清理操作(比如数据库初始化),同样要把AsyncClient放在async with里:
@pytest.fixture async def client(): # 前置操作:比如初始化测试数据库 await setup_test_database() async with AsyncClient(app=app, base_url="http://test") as ac: yield ac # 后置操作:比如清理测试数据 await teardown_test_database()
关键说明
AsyncClient是异步上下文管理器,必须通过async with初始化才能得到可用的客户端实例。之前的fixture错误地直接yield了AsyncClient构造函数的返回值,既没有进入上下文,又因为pytest的yield机制返回了生成器对象,自然无法调用post等客户端方法。
内容的提问来源于stack exchange,提问作者softshipper
相关产品推荐
相关产品推荐

