如何测试一个BaseModel类从一个方法检索字段?



我发现自己为两个类的方法编写测试,其中一个类具有str字段,它从另一个BaseModel类检索:

class Person(BaseModel):
firstname: Optional[str] = settings.get_settings().firstname
lastname: Optional[str] = settings.get_settings().lastname

现在,当我尝试创建夹具时,我遇到了这个问题

#test file
@pytest.fixture
def person_class():
person = Person(
firstname="Marco",
lastname="Marche"
)
return person()

错误:pydantic.error_wrappers.ValidationError: 31 validation errors for Settings

Settings是一个basessettings类。

class Settings(BaseSettings):
firstname: str,
lastname: str,
address: str,
telephone: str
@lru_cache
def get_settings() -> Settings:
return Settings()

如何通过创建一个"fake"由我输入字段的人员类?

我假设您在Settings定义中有一个错别字,并且在firstname,lastnameaddress行中应该没有逗号。

你得到的错误很可能是因为你的Settings类需要firstname,lastname和其他字段的值,但你没有提供任何。

我认为最简单的解决方案是在get_settings()函数的实例化中给它一些假值,例如:

@lru_cache
def get_settings() -> Settings:
return Settings(
firstname="fake firstname",
lastname="fake lastname",
address="fake address",
telephone="fake telephone",
)

Pydantic确实在模型上提供了construct()方法,允许在没有验证的情况下创建模型,但是,我认为这不会在您的情况下起作用,因为您从Settings中获得Person的默认值,在像您这样的情况下,仍在评估中。