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

Pytest中内存数据无法通过Fixture持久化问题排查

问题原因及解决办法

核心原因

你遇到的问题根源在于每次请求FastAPI都会创建一个新的MockUserRepo实例。虽然user_repo fixture的作用域是function,但你在app.dependency_overrides[UserRepo]中绑定的是MockUserRepo类,而非已初始化的实例。这就导致:

  • POST请求触发时,FastAPI实例化一个全新的MockUserRepo,用户被添加到这个实例的database列表中
  • GET请求触发时,FastAPI又会创建另一个全新的MockUserRepo,它的database是空的,自然找不到之前添加的用户

修复方案

修改user_repo fixture,创建一个MockUserRepo的单实例,让同一测试内的所有请求复用这个实例:

@fixture(scope="function")
def user_repo(app: FastAPI):
    print("created")

    @dataclass
    class User:
        id: int
        username: str
        password: str

    class MockUserRepo:
        def __init__(self):
            self.database = []

        def create_user(self, user_create_model: UserCreateModel, session: Session) -> User | None:
            if session:
                user = User(
                    id=len(self.database) + 1,
                    username=user_create_model.username,
                    password=user_create_model.password,
                )
                self.database.append(user)
                return user

        def get_user_by_id(self, id: int, session: Session) -> User | None:
            print(self.database)
            if session:
                for user in self.database:
                    if user.id == id:
                        return user
                return None

    # 创建单实例,用lambda返回该实例而非类
    mock_repo_instance = MockUserRepo()
    app.dependency_overrides[UserRepo] = lambda: mock_repo_instance
    yield

这样,同一个测试函数里的POST和GET请求会共用同一个MockUserRepo实例,database数据就能正常共享了。

额外说明

  • 由于user_repo的作用域是function,每个测试函数都会得到全新的MockUserRepo实例,不会出现测试间的数据污染
  • 单测应保持隔离性,function作用域是合理的选择,无需调整

内容的提问来源于stack exchange,提问作者Michael Xia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:26:27