繁体   English   中英

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

[英]How to mock value the hybrid property of sqlalchemy model?

我有一张桌子:

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

表的用法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM