symfonyの2.8.13 /ドクトリンORM 2.5.5/5.7.5 PHPUnitのSymfony2の教義:PHPUnitの:セットエンティティID単位で嘲笑エンティティマネージャでフラッシング時には
をテストし、私はそのクラスのメソッドをテストしたいです教義エンティティマネージャを利用する。このパブリックメソッドは、Bookmarkエンティティをインスタンス化し、それをフラッシュしてこのエンティティを返すプライベートメソッドを呼び出します。その後、テストされたメソッドで、エンティティIDにアクセスする必要があります。ブックマークエンティティ自体を除いてすべてが嘲笑されます。主な問題は、自分のエンティティにsetId()メソッドがないことです。ここでコードと私の主なアイデアはこの問題を解決するが、私はそれが正しいかどうかわからないのですか?
テスト済みクラスとメソッド
class BookmarkManager
{
//...
public function __construct(TokenStorageInterface $tokenStorage, ObjectManager $em, Session $session)
{
//...
}
public function manage($bookmarkAction, $bookmarkId, $bookmarkEntity, $bookmarkEntityId)
{
//...
$bookmark = $this->add($bookmarkEntity, $bookmarkEntityId);
//...
$bookmarkId = $bookmark->getId();
//...
}
private function add($entity, $entityId)
{
//...
$bookmark = new Bookmark();
//...
$this->em->persist($bookmark);
$this->em->flush();
return $bookmark;
}
}
テスト
class BookmarkManagerTest extends \PHPUnit_Framework_TestCase
{
public function testThatRestaurantAdditionToBookmarksIsWellManaged()
{
//...
// THIS WON'T WORK AS NO setId() METHOD EXISTS
$entityManagerMock->expects($this->once())
->method('persist')
->will($this->returnCallback(function ($bookmark) {
if ($bookmark instanceof Bookmark) {
$bookmark->setId(1);
}
}));
//...
$bookManager = new BookmarkManager($tokenStorageMock, $entityManagerMock, $sessionMock);
//...
}
}
ソリューション?
1-提案hereとして反射クラスの使用を行います
$entityManagerMock->expects($this->once())
->method('persist')
->will($this->returnCallback(function ($bookmark) {
if ($bookmark instanceof Bookmark) {
$class = new \ReflectionClass($bookmark);
$property = $class->getProperty('id');
$property->setAccessible(true);
$property->setValue($bookmark, 1);
//$bookmark->setId(1);
}
}));
2-実際の一方から延び試験Boookmarkエンティティを作成し、SETID()メソッドを追加します。次に、このクラスのモックを作成し、これを使ってReturnCallbackメソッドから取得したものを置き換えてカスタマイズしますか?それは気が狂ったようだ...
どのような考え?ご協力いただきありがとうございます。
私は反射が悪いと思われることを知っていますが、あなたのリフレクション方法が最良の選択肢だと思います。 TestBookmarkやMockEntityManagerなど、テストのためだけにクラスを作成することについて何か間違っています。テストでこれを定期的に行うつもりなら、 'setProperty($ object、$ property、$ value)'メソッドが便利なReflectionSetterTraitを作成することがわかりました。 – mickadoo
@mickadoo私は同意する、形質は良いオプションです。エンティティマネージャーのために、私は特定のクラスを作成しません、私はPHPUnitモックビルダーを使用してそれを擬似します。とにかく、反射はこの場合の解決策のようです。 – Cruz