You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI+Strawberry GraphQL多pytest用例运行报NoneType无send属性错误

问题产生原因

这个报错的核心是测试客户端生命周期管理缺失:

  1. 你当前使用的函数级fixture仅完成了TestClient实例化和返回,没有实现用例执行后的资源回收逻辑,也没有触发FastAPI应用完整的startup/shutdown生命周期事件。
  2. Strawberry的GraphQL ASGI处理层内部会维护请求传输通道的状态引用,第一个测试用例执行完成后,pytest回收fixture对象时,TestClient底层的httpx连接、ASGI传输通道没有被显式关闭,残留的通道对象引用被置为None但没有从上下文里清除。
  3. 第二个测试用例新建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:15:31