2017年9月23日土曜日

テストではbootKernel()でリフレッシュしないとpostLoad()が呼ばれない場合がある

イベントリスナーのpostLoadはEntityを取得した後で実行される。しかしユニットテストなどで、あるEntityをEntityManagerによって登録したあと、そのEntityManagerから再び同じEntityを取得すると、イベントが発生しない。その場合は、取得前に一旦、プロセスをリフレッシュすればイベントが発生するようになる。
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

class PostLoadTest extends KernelTestCase
{
    /**
     * @var Doctrine\ORM\EntityManager
     */
    private $em;

    protected function setUp()
    {
        self::bootKernel();
        $this->em = static::$kernel->getContainer()
                                   ->get('doctrine')
                                   ->getManager();
    }
    public function testPostLoad()
    {
        $entity = new \Hyoujun\AppBundle\Entity\AnEntity();
        //...
        $this->em->persist($entity);
        $this->em->flush();
        
        self::bootKernel();//ここでプロセスをリフレッシュ。

        $loaded = $this->em->getRepository('HyoujunAppBundle:AnEntity')
                           ->find($entity->getId());
        //...(postLoadが呼ばれたかを検証)
    }
    protected function tearDown()
    {
        parent::tearDown();
        $this->em->close();
        $this->em = null;
    }
}
Symfony\Bundle\FrameworkBundle\Test\KernelTestCase::bootKernel()で、プロセスをリフレッシュすれば、postLoad()が呼ばれる。

0 件のコメント:

コメントを投稿