【问题标题】:How to test a BaseModel class with fields retrieved from a method?如何使用从方法中检索的字段测试 BaseModel 类?
【发布时间】:2022-12-11 17:43:31
【问题描述】:

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

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

设置是一个 BaseSettings 类。

class Settings(BaseSettings):
    firstname: str,
    lastname: str,
    address: str,
    telephone: str

@lru_cache
def get_settings() -> Settings:
    return Settings()

如何通过创建一个包含我输入的字段的“假”Person 类来解决它?

【问题讨论】:

    标签: python pytest pydantic


    【解决方案1】:

    我假设您的 Settings 定义中有错字,firstnamelastnameaddress 行中不应有逗号。

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

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

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

    Pydantic 确实在模型上提供了 construct() 方法,它允许 create models without validation,但是,我认为这在您的情况下不起作用,因为您是从 Settings 获取 Person 的默认值,在像你这样的情况,仍在评估中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2013-07-28
      • 2012-08-04
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多