【问题标题】:Adding mock object into sqlalchemy collection raises exception将模拟对象添加到 sqlalchemy 集合中会引发异常
【发布时间】:2014-10-12 10:51:59
【问题描述】:

我正在为具有一对多关系的 SQLAlchemy 模型类编写单元测试,但无法将模拟对象添加到集合中。

正在测试的类:

class PCLRun(Base):
    __tablename__ = 'pcl_runs'
    id = Column(Integer, primary_key=True)
    ...
    files = relationship("PCLOutputFile", backref='pcl_run')

class PCLOutputFile(Base):
    __tablename__ = 'pcl_output_files'
    id = Column(Integer, primary_key=True)
    ...
    pcl_run_id = Column(Integer, ForeignKey('pcl_runs.id'))

测试代码:

class PCLRunTests(unittest.TestCase):
    def test_foo(self):
        file_mock = mock.Mock()
        pcl_run = PCLRun()
        pcl_run.files.append(file_mock)
        ...

附加模拟对象引发异常:

TypeError: 'Mock' object has no attribute '__getitem__'

有没有办法通过向其中添加模拟来对包含关系的类进行单元测试,同时保持集合的行为类似于一个简单的列表?

我使用的是 mock 1.0.1 和 sqlalchemy 0.8.2。

【问题讨论】:

    标签: python unit-testing sqlalchemy mocking python-mock


    【解决方案1】:

    我认为问题在于PCLRun 实例期望PCLOutputFile 类的实例作为append 方法的参数。您的 Mock 实例没有任何相同的属性,因此在尝试 __getitem__ 方法时会引发错误。

    您可以尝试利用 Python 对鸭子类型的使用来创建具有 PCLOutputFile 文件的所有属性的 Mock 对象,但这可能会很困难,具体取决于查询需要的列值之外的继承元数据量..

    或者,您可以定义设置/拆卸方法/夹具,它们将在您的测试表中创建PCLOutputFile 类的真实实例。 nosetest 模块为这种类型的测试模式提供了tools

    【讨论】:

      猜你喜欢
      • 2018-06-09
      • 2011-11-28
      • 2014-12-09
      • 1970-01-01
      • 2017-09-20
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多