4

我正在为具有一对多关系的 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__'

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

我正在使用模拟 1.0.1 和 sqlalchemy 0.8.2。

4

1 回答 1

0

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

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

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

于 2014-10-24T04:22:22.507 回答