如何测试从方法获取字段的BaseModel类?解决Settings验证错误
解决Pytest里Person类初始化的ValidationError问题
报错原因
你定义Person类时,字段默认值在类加载阶段就会执行settings.get_settings(),而Settings作为BaseSettings子类,初始化时会自动从环境变量、配置文件读取所有必填字段(比如address、telephone)的值。测试环境未提供这些配置,直接触发了ValidationError。另外你原Settings类的字段定义用了逗号,这是语法错误,得先修正。
方法一:创建测试专用的FakePerson类
直接写一个不依赖Settings的假Person类,自定义字段和默认值,测试时用这个类替代原Person:
# 测试文件代码 from pydantic import BaseModel, Optional class FakePerson(BaseModel): firstname: Optional[str] = "Marco" lastname: Optional[str] = "Marche" @pytest.fixture def person(): return FakePerson()
如果需要保留原Person类的其他逻辑,也可以继承后覆盖默认值:
# 测试文件代码 from 你的业务模块 import Person class FakePerson(Person): firstname: Optional[str] = "Marco" lastname: Optional[str] = "Marche" @pytest.fixture def person(): return FakePerson()
方法二:Mock get_settings方法(更推荐,无需修改原类)
用pytest-mock库把get_settings方法替换掉,让它返回一个预配置好的Settings实例,这样原Person类的默认值就能正常加载,完全不用改动原业务代码:
# 测试文件代码 from 你的业务模块 import Person, get_settings, Settings @pytest.fixture def mock_settings(mocker): # 构造一个填充好所有必填字段的假Settings实例 fake_settings = Settings( firstname="Marco", lastname="Marche", address="测试地址", telephone="1234567890" ) # 替换原get_settings函数,返回假实例 mocker.patch("你的业务模块.get_settings", return_value=fake_settings) return fake_settings @pytest.fixture def person(mock_settings): # 此时初始化Person不会再触发配置加载错误,也可以手动传值覆盖默认 return Person(firstname="Marco", lastname="Marche")
顺带修正原代码的语法错误
你原Settings类字段后面用了逗号,这是语法错误,需要改成冒号:
# 修正后的Settings类 from pydantic_settings import BaseSettings from functools import lru_cache class Settings(BaseSettings): firstname: str lastname: str address: str telephone: str @lru_cache def get_settings() -> Settings: return Settings()
另外你原夹具里写的return person()是错误的——Person(...)已经是实例,直接return person即可。
内容的提问来源于stack exchange,提问作者Plaoo
相关产品推荐
相关产品推荐

