FastAPI+Strawberry GraphQL多pytest用例运行报NoneType无send属性错误
问题产生原因
这个报错的核心是测试客户端生命周期管理缺失:
- 你当前使用的函数级fixture仅完成了TestClient实例化和返回,没有实现用例执行后的资源回收逻辑,也没有触发FastAPI应用完整的startup/shutdown生命周期事件。
- Strawberry的GraphQL ASGI处理层内部会维护请求传输通道的状态引用,第一个测试用例执行完成后,pytest回收fixture对象时,TestClient底层的httpx连接、ASGI传输通道没有被显式关闭,残留的通道对象引用被置为None但没有从上下文里清除。
- 第二个测试用例新建TestClient发起请求时,Strawberry的处理逻辑误调用了上一轮残留的None值通道对象的
send方法,就抛出了'NoneType' object has no attribute 'send'错误。
修复方案
直接修改conftest里的fixture实现,用生成器+上下文管理器的写法,确保每个用例跑完后自动关闭测试客户端、触发应用shutdown事件清理所有残留状态:
import pytest from src.graphql.db.session import get_session from tests.graphql.db import overide_get_session from fastapi.testclient import TestClient from src.app import create_app @pytest.fixture def test_client_keep_alive(): app = create_app() app.dependency_overrides[get_session] = overide_get_session # 通过上下文管理器自动管理客户端生命周期,用例结束后自动执行关闭逻辑 with TestClient(app) as client: yield client
可选优化项:
- 如果修改后仍偶发同类报错,可以在测试环境初始化Strawberry路由时,把
keep_alive参数设为False,关闭长连接复用逻辑,避免跨用例的连接残留。 - 测试mutation操作时建议统一用POST方法提交GraphQL请求,避免GET参数长度限制、缓存机制干扰测试结果。
内容的提问来源于stack exchange,提问作者SYED FAISAL
相关产品推荐
相关产品推荐

