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
相关产品推荐
相关产品推荐

