如何模拟 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 语句中使用布尔表达式并返回 True
或 False
有点多余。只需使用布尔表达式本身:
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
。
我有一个 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 语句中使用布尔表达式并返回 True
或 False
有点多余。只需使用布尔表达式本身:
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
。