说我设置了两个模型:
class ParentFoo(SqlBase):
__tablename__ = "parents"
id = Column(String, primary_key=True)
children = relationship("ChildFoo", backref="parents")
class ChildFoo(SqlBase):
__tablename__ = "children"
id = Column(String, primary_key=True)
现在在请求处理程序中,假设我想从父数据库中获取数据库中的所有子实体:
class RequestHandler():
def get(self, parent_id):
parent = database.query(parent_id)
children = parent.children
send_response(children)
SQLAlchemy ORM API允许此类查询。对我来说问题是我在编写测试时。我有一个通用RequestHandler
类,它在构造函数中将ParentFoo
和ChildFoo
类作为参数。所以我的请求处理程序类实际上是这样的:
class GenericRequestHandler():
def __init__(self, parent_class, child_class):
self.parent_class = parent_class
self.child_class = child_class
def get(self, parent_id):
parent = database.query(self.parent_class, parent_id)
children = parent.getattr(self.child_class.__tablename__, None)
只要父项上的列名与子实体的__tablename__
匹配,这就行了。我执行这个约定。问题是测试这个。
Python的mock
库似乎没有提供属性查找的返回值,我不想模拟getattr
函数,因为它在我的get方法的其他地方使用。
有什么想法吗?
编辑1: 关于我对属性查找的评论:我可以模拟一个函数并提供一个返回值。
mocked_function.return_value = my_desired_value
但是如何模拟属性?
mocked_object.attribute_of_interest = my_desired_value
编辑2:
在我的测试中,我为父类和子类的构造函数提供了MagicMock
个对象,并设置了一个MagicMock
对象,以便通过调用database.query
返回:
parent_class_mock = MagicMock()
child_class_mock = MagicMock()
parent_entity = MagicMock()
type(parent_entity).getattr = PropertyMock(return_value=[child_entity])
database.query.return_value = parent_entity
class ConcreteRequestHandler(GenericRequestHandler):
def __init__(self, parent_class, child_class):
super(ConcreteRequestHandler, self).__init__(parent_class, child_class)
如您所见,我尝试使用mock
的{{1}}来设置属性。当我运行测试时,我收到错误PropertyMock
。请参阅this所以我问过与之相关的问题。