如何模拟 sqlalchemy 模型的混合 属性 值?

How to mock value the hybrid property of sqlalchemy model?

我有一个 table:

class A(Base):
    id = Column(Integer, primary_key=True, autoincrement=True)
    age = Column(Integer)

    @hybrid_property
    def is_adult(self):
        if self.age > 18:
            return True
        return False

table 的用法:

def check_adult():
    this_user = A.query.first()
    is_adult = this_user.is_adult
    if this_user.is_adult:
        return "Yes"
    else:
        return "No"

现在要为这段代码编写单元测试,我找不到模拟 is_adult 值的方法。

@patch("A")
def test_check_adult(mock_A):
    this_user = mock_A.return_value.query.return_value.first.return_value
    this_user.is_adult = True
    assert check_adult() == "Yes"

请提供模拟 hybrid_property 和 hybrid_method 的方法。

mock_A.return_value 会模拟 A(),但你不是在调用 A,而是访问它的属性 A.query 等,所以

this_user = mock_A.query.first.return_value

顺便说一句,在 if 语句中使用布尔表达式并返回 TrueFalse 有点多余。只需使用布尔表达式本身:

class A(Base):
    id = Column(Integer, primary_key=True, autoincrement=True)
    age = Column(Integer)

    @hybrid_property
    def is_adult(self):
        return self.age > 18

这还有直接在查询上下文中工作的额外好处,因此您不需要单独指定 @is_adult.expression