私は Symfony2 プロジェクトのテストに取り組んでいます。現在、エンティティ オブジェクトを永続化せずにテストを作成する方法を探しています。問題は、 idがプライベート フィールドであり、そのためのセッターがないことです。新しいオブジェクトを作成していくつかのプロパティを設定することはできますが、 getId()呼び出しに関連するものは何もテストできません。
$entity = new TheEntity();
// Can't set ID!
$entity->setProperty('propertyValue');
$name = $entity->getProperty(); // OK
$id = $entity->getId(); // not OK - null
私が知っている解決策:
- カーネル全体の初期化 (Symfony のWebTestCase::createKernel() ) とエンティティの永続化
- 有効な ID を返す、すべてのエンティティのモック オブジェクトの作成
- 初期化されたオブジェクトを返すTheEntityクラスの static メソッドのようなハック、またはidフィールドのセッターの追加
これに対処するための推奨される方法は何ですか? セット ID を使用して、クリーンで迅速な方法でテスト用のエンティティを取得する方法は?
編集
モックでこれを解決できることが判明しました...申し訳ありませんが、私はまだ学んでいます。私は物事を成し遂げるための、クリーンで標準的でありながら速い方法を探していました。ただし、 の 2 番目のパラメーターを忘れていました。getMock()
つまり、使用するエンティティのすべてのメソッドをモックする必要はありません。複数などを避けたかったの->expects()->method()->will()
ですが、これは次を追加することで実現されますarray('getId')
。このヘルパー メソッドは問題を解決します。
protected function getEntityMock($entityClass, $id)
{
$entityMock = $this->getMock($entityClass, array('getId'));
$entityMock
->expects($this->any())
->method('getId')
->will($this->returnValue($id));
return $entityMock;
}
同じクラスの多くのエンティティを作成する場合、もちろん、次のようなヘルパー メソッドを使用すると、さらに単純化できます。
protected function getTheEntityMock($id)
{
return $this->getEntityMock('\The\NameSpace\TheEntity', $id);
}
唯一の制限は、エンティティ自体はid
プロパティを使用できず、 getId()
getter のみを使用できることです。
貴重な情報は引き続き歓迎しますが、PHPUnit はgetMock()
これをうまく解決したと思います。