PhpUnit тесты — подводные камни

Автор: Aport Суббота, Январь 31st, 2015 Нет комментариев

Рубрика: Язык PHP

Оказывается, PhpUnit в каждом тесте использует копии переменных объявленных в методе setUp.

По этой причине, используя Doctrine, когда я писал тест на UPDATE записи в таблице базы данных, у меня получался INSERT. 

Привожу пример неправильного когда, когда ожидается UPDATE, а получается INSERT.

<?php
namespace Yapro\OrientDB\Tests;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;// необходим для метода setUp()

class Crud extends WebTestCase
{
    /**
 * @var \Doctrine\ORM\EntityManager
 */
    private $_em;

    /**
 * емэйл которым будем проверять добавление/обновление/удаление (как некое уникальное значение сущности)
 * @var string
 */
    private $email = 'test@site.ru';

    /**
 * настройки теста
 */
    protected function setUp()
    {
        $kernel = static::createKernel();
        $kernel->boot();
        $this->_em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
        $this->_em->beginTransaction();
    }

    function testFind()
    {
        // получаем репозиторий
        $repository = $this->_em->getRepository('AcmeDemoBundle:UnitTestEntity');

        return $repository;
    }

    /**
 * @depends testFind
 */
    function testUpdate($repository)
    {
        // проверяем сущестование записи
        $entity = $repository->findOneBy(array('email'=>$this->email));

        // обновляем строку в таблице
        $entity->setTimeCreated(2);
        $this->_em->persist($entity);
        $this->_em->flush();
    }
}

Обратите внимание на $this->_em, которая в каждом из методов является копией основной (объявленной в методе setUp).

А теперь пример правильного когда, когда выполняется ожидаемый UPDATE.

<?php
namespace Yapro\OrientDB\Tests;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;// необходим для метода setUp()

class Crud extends WebTestCase
{
    /**
 * @var \Doctrine\ORM\EntityManager
 */
    private $_em;

    /**
 * емэйл которым будем проверять добавление/обновление/удаление (как некое уникальное значение сущности)
 * @var string
 */
    private $email = 'test@site.ru';

    /**
 * настройки теста
 */
    protected function setUp()
    {
        $kernel = static::createKernel();
        $kernel->boot();
        $this->_em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
        $this->_em->beginTransaction();
    }

    function testUpdate()
    {
        // получаем репозиторий
        $repository = $this->_em->getRepository('AcmeDemoBundle:UnitTestEntity');

        // проверяем сущестование записи
        $entity = $repository->findOneBy(array('email'=>$this->email));

        // обновляем строку в таблице
        $entity->setTimeCreated(2);
        $this->_em->persist($entity);
        $this->_em->flush();
    }
}

При этом $this->_em, в методе testUpdate это уже копия из метода setUp. А если например изменить значение переменной $this->_em, то в следующем тестовом методе обратившись к $this->_em мы получим копию первоначального значения из метода setUp.

Пример сократил для понимания дела. Удачки в тестировании.

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты