2012-03-22 17 views
0

私はDoctrine2カスタムリポジトリとDoctrine Fixturesを使用してPHPUnitテストを行っています。私は照会が私の什器から期待される実体を私に返すことを試したかったのです。Doctrine2エンティティをassertEqualsでテストするとメモリ不足のエラーが発生する

しかし、私が$this->assertEquals($expectedEntity, $result);を試すと、Fatal error: out of memoryが得られます。私はそれがすべての関係とエンティティマネージャーとそれ以外のものに再帰していると推測しています。

この同等性をテストする良い方法はありますか?私はエンティティのIDでの評価を主張するべきですか?

編集:ここでは は、エンティティのテストコードここ

<?php 
use Liip\FunctionalTestBundle\Test\WebTestCase; 

class AbstractRepositoryTestCase extends WebTestCase 
{ 
    /** 
    * @var Doctrine\ORM\EntityRepository 
    */ 
    protected $repo; 

    /** 
    * @var Doctrine\Common\DataFixtures\Executor\AbstractExecutor 
    */ 
    protected $fixtureExecutor; 

    /** 
    * @var string Which repository to load, overriden by derived class 
    */ 
    protected $repoName; 

    /** 
    * @var array Fixture classes to load on setup 
    */ 
    protected $fixtures = array(); 

    public function setUp() 
    { 
     $kernel = static::createKernel(); 
     $this->repo = $kernel->boot(); 
     $this->repo = $kernel->getContainer() 
          ->get('doctrine.orm.entity_manager') 
          ->getRepository($this->repoName); 

     $this->fixtureExecutor = $this->loadFixtures($this->getFixtures()); 
    } 

    public function getFixtures() 
    { 
     return $this->fixtures; 
    } 
} 

class ArticleRepositoryTest extends AbstractRepositoryTestCase 
{ 
    /** 
    * @var string Which repository to load, overriden by derived class 
    */ 
    protected $repoName = 'MyMainBundle:Article'; 

    /** 
    * @var array Fixture classes to load on setup 
    */ 
    protected $fixtures = array(
     'My\MainBundle\DataFixtures\ORM\LoadUserData', 
     'My\MainBundle\DataFixtures\ORM\LoadArticleData', 
     'My\MainBundle\DataFixtures\ORM\LoadFeedsData', 
     'My\MainBundle\DataFixtures\ORM\LoadFeedDataData', 
     'My\MainBundle\DataFixtures\ORM\LoadUserReadArticleData', 
    ); 
    public function testGetNextArticle_ExpectCorrect() 
    { 
     /** @var Doctrine\Common\DataFixtures\ReferenceRepository **/ 
     $refRepo = $this->fixtureExecutor->getReferenceRepository(); 

     /** @var FeedStream\MainBundle\Entity\Article **/ 
     $curr = $refRepo->getReference('feed-1-article-3'); 
     $expected = $refRepo->getReference('feed-1-article-2'); 
     $expected2 = $refRepo->getReference('feed-1-article-1'); 
     $next = $this->repo->getNextArticle($curr->getFeed()->getId(), $curr); 

     $this->assertNotNull($next); 
     // this is the part that doesn't work 
     $this->assertEquals($expected, $next); 
     // this is the code I've used instead 
     $this->assertEquals($expected->getId(), $next->getId()); 
    } 
} 

されている

<?php 

namespace My\MainBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* My\MainBundle\Entity\Article 
* 
* @ORM\Table(name="articles", uniqueConstraints={ 
* @ORM\UniqueConstraint(name="feed_guid", columns={"feed_id", "guid"}), 
* @ORM\UniqueConstraint(name="article_slug_unique", columns={"feed_id", "slug"}) 
* }) 
* @ORM\Entity(repositoryClass="My\MainBundle\Repository\ArticleRepository") 
*/ 
class Article 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var string $guid 
    * 
    * @ORM\Column(name="guid", type="string", length=255, nullable=false) 
    */ 
    private $guid; 

    /** 
    * @var string $title 
    * 
    * @ORM\Column(name="title", type="string", length=255, nullable=false) 
    */ 
    private $title; 

    /** 
    * @var datetime $pubDate 
    * 
    * @ORM\Column(name="pub_date", type="datetime", nullable=true) 
    */ 
    private $pubDate; 

    /** 
    * @var text $summary 
    * 
    * @ORM\Column(name="summary", type="text", nullable=true) 
    */ 
    private $summary; 

    /** 
    * @var text $content 
    * 
    * @ORM\Column(name="content", type="text", nullable=false) 
    */ 
    private $content; 

    /** 
    * @var string $sourceUrl 
    * 
    * @ORM\Column(name="source_url", type="string", length=255, nullable=true) 
    */ 
    private $sourceUrl; 

    /** 
    * @var string $commentUrl 
    * 
    * @ORM\Column(name="comment_url", type="string", length=255, nullable=true) 
    */ 
    private $commentUrl; 

    /** 
    * @var string $slug 
    * 
    * @ORM\Column(name="slug", type="string", length=64, nullable=false) 
    */ 
    private $slug; 

    /** 
    * @var string $thumbnailFile 
    * 
    * @ORM\Column(name="thumbnail_file", type="string", length=64, nullable=true) 
    */ 
    private $thumbnailFile; 

    /** 
    * @var My\MainBundle\Entity\ArticleEnclosure 
    * 
    * @ORM\ManyToOne(targetEntity="My\MainBundle\Entity\ArticleEnclosure") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="thumbnail_enclosure_id", referencedColumnName="id") 
    * }) 
    */ 
    private $thumbnailEnclosure; 

    /** 
    * @var My\MainBundle\Entity\ArticleImageScrape 
    * 
    * @ORM\ManyToOne(targetEntity="My\MainBundle\Entity\ArticleImageScrape") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="thumbnail_scrape_id", referencedColumnName="id", unique=false) 
    * }) 
    */ 
    private $thumbnailScrape; 

    /** 
    * @var My\MainBundle\Entity\ArticleBitly 
    * 
    * @ORM\OneToOne(targetEntity="My\MainBundle\Entity\ArticleBitly", mappedBy="article", orphanRemoval=true) 
    */ 
    private $bitly; 

    /** 
    * @var My\MainBundle\Entity\ArticleEnclosure 
    * 
    * @ORM\OneToMany(targetEntity="My\MainBundle\Entity\ArticleEnclosure", mappedBy="article", orphanRemoval=true) 
    */ 
    private $enclosures; 

    /** 
    * @var My\MainBundle\Entity\ArticleImageScrape 
    * 
    * @ORM\OneToMany(targetEntity="My\MainBundle\Entity\ArticleImageScrape", mappedBy="article", orphanRemoval=true) 
    */ 
    private $scrapes; 

    /** 
    * @var My\MainBundle\Entity\ArticleLink 
    * 
    * @ORM\OneToMany(targetEntity="My\MainBundle\Entity\ArticleLink", mappedBy="article", orphanRemoval=true) 
    */ 
    private $links; 

    /** 
    * @var My\MainBundle\Entity\Feed 
    * 
    * @ORM\ManyToOne(targetEntity="My\MainBundle\Entity\Feed", inversedBy="articles") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="feed_id", referencedColumnName="id", nullable=false) 
    * }) 
    */ 
    private $feed; 

    /** 
    * @var My\MainBundle\Entity\ArticleAuthor 
    * 
    * @ORM\ManyToOne(targetEntity="My\MainBundle\Entity\ArticleAuthor", inversedBy="articles") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="author_id", referencedColumnName="id") 
    * }) 
    */ 
    private $author; 

    public function __construct() 
    { 
     $this->links = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
} 
+0

エンティティのようなコードとテストを表示できますか? doctrine2のエンティティはエンティティマネージャとの接続がないので、何か間違っているか何かが壊れています! – Sgoettschkes

答えて

0

あなたはまたに加えて、クラスをテストする必要があります(ゲッター/セッターは、スペースを節約するために省略します) ID。

+0

他のエンティティタイプにも 'getId()'があるので意味があると思います。 – Matt

+0

オブジェクトの比較を行う==ではなく、===を使ってオブジェクト参照の等価性をテストすることもできます。理論的には、Doctrineはアイデンティティマップを使用しているので動作するはずですが、このマップがすべてのサーカスで使用されているかどうかはわかりません。興味深いもの: – Maxence

+0

私は、リファレンスがFixtureのリファレンスとクエリの結果と同じになるとは思っていませんでしたが、あなたが言ったように、 – Matt

3

エンティティが等しい場合、assertEqualsはDoctrine Entitiesで正常に動作します。

オブジェクトが同じではない場合に問題が発生し、phpunitがentitesグラフを探索し、グラフに応じて終了しない場合があります。 残念ながら、assertEqualsmaxDepthパラメータが予想通りに再帰を制限していないようですので、私は解決策がある怖い:

永続化するエンティティを必要とする、との識別子を与える
  • $this->assertEquals($entity1->getId(), $entity2->getId())両者が完全に動作しますが、彼らはあなたに違いが

  • ベストゾルが何であるかについて多くの詳細を与えることはありません失敗

  • $this->assertEquals(spl_object_hash($entity1), spl_object_hash($entity2))または$this->assertTrue($entity1 === $entity2)の場合、非一致するオブジェクトIMHO:配列比較のためのクラス名とプロパティを持つ配列にエンティティを変換します。

    Doctrine \ Common \ Util \ Debugを使用します。 $ this-> assertEquals(デバッグ::エクスポート($エンティティ1)、デバッグ::エクスポート($エンティティ2));

  • 性質が異なっているものだと言って、あなたに明確なエラーになります

(このケースでも、クラスが異なる)

Failed asserting that two objects are equal. 
--- Expected 
+++ Actual 
@@ @@ 
stdClass Object (
- '__CLASS__' => 'Service\Entity\RoleLN' 
- 'id' => 'ln_admin' 
- 'isApprover' => false 
- 'rate' => null 
- 'name' => 'ln_admin' 
- 'roles' => null 
- 'processTasks' => null 
+ '__CLASS__' => 'Service\Entity\Role' 
+ 'id' => 99 
+ 'rate' => 400 
+ 'name' => 'roleAdmin' 
+ 'roleLN' => stdClass Object (...) 
+ 'organisation' => stdClass Object (...) 
+ 'users' => null 
+ 'matterRoles' => Array() 

(あなたがassertEntitiesEqualsのような方法には、この比較を置くことができる)

関連する問題