测试SQLAlchemy父子关系查询

时间:2016-04-22 00:38:12

标签: python testing sqlalchemy

说我设置了两个模型:

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类,它在构造函数中将ParentFooChildFoo类作为参数。所以我的请求处理程序类实际上是这样的:

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所以我问过与之相关的问题。

0 个答案:

没有答案