4

1 対多の関係を持つ 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のインスタンスを期待していることだと思います。インスタンスには同じ属性がないため、メソッドを試行するとエラーが発生します。PCLOutputFileappendMock__getitem__

Python のダックタイピングの使用を利用して、ファイルMockのすべての属性を持つオブジェクトを作成するPCLOutputFileこともできますが、クエリが必要とする列の値を超えて継承されたメタデータの量によっては、難しい場合があります。

または、テスト テーブルにクラスの実際のインスタンスを作成するセットアップ/ティアダウン メソッド/フィクスチャを定義することもできます。PCLOutputFileノーズテスト モジュールは、このタイプのテスト パターン用のツールを提供します。

于 2014-10-24T04:22:22.507 に答える