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

如何测试从方法获取字段的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:25:35