Оказывается, 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.
Пример сократил для понимания дела.
Удачки в тестировании.
Комментарии
Комментариев пока нет.