Как тестировать модели Symfony2 с помощью PHPUnit

Я пытался протестировать модель в проекте Symfony2, но я не знаю, как заставить диспетчер сущностей сохранять и извлекать записи.

Может ли кто-нибудь указать мне правильные документы для этого?


person nerohc    schedule 06.09.2011    source источник


Ответы (3)


Чтобы протестировать свои модели, вы можете использовать метод setUp(). ссылка на документы

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class MyModelTest extends WebTestCase
{
    /**
     * @var EntityManager
     */
    private $_em;

    protected function setUp()
    {
        $kernel = static::createKernel();
        $kernel->boot();
        $this->_em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
        $this->_em->beginTransaction();
    }

    /**
     * Rollback changes.
     */
    public function tearDown()
    {
        $this->_em->rollback();
    }

    public function testSomething()
    {
        $user = $this->_em->getRepository('MyAppMyBundle:MyModel')->find(1);
    }

Надеюсь, это поможет вам

person Benjamin Lazarecki    schedule 30.05.2012
comment
А вот ссылка на документы @symfony.com — symfony.com/doc/ current/cookbook/testing/doctrine.html - person Meetai.com; 22.08.2015

Ожидается, что модели Symfony2 будут объектами предметной области, которые представляют модели предметной области в коде.

Объекты предметной области должны определяться исключительно для реализации бизнес-поведения соответствующей концепции предметной области, а не определяться требованиями более конкретной технологической структуры. -- Дизайн на основе домена — Википедия, бесплатная энциклопедия

Объекты домена (и его тесты) не должны зависеть от API Symfony2 и API Doctrine, за исключением случаев, когда вы действительно хотите протестировать себя.

Написание модульных тестов Symfony2 ничем не отличается от написания стандартных модульных тестов PHPUnit. -- Symfony — Тестирование

Вы можете протестировать бизнес-логику (процессы, правила, поведение и т. д.), представленную в объектах предметной области, с помощью PHPUnit (или Behat) и обычно тестовые двойники.

person iteman    schedule 06.09.2011
comment
Да, я прочитал документы и понимаю эти концепции. Но если я хочу протестировать, например, поведение Sluggable, оно работает только после сохранения записи. Как я могу это проверить? неважно, что пакет, вероятно, тестируется, я просто хочу посмотреть, как тестировать вещи в symfony2 - person nerohc; 07.09.2011
comment
Для нас важно знать, каковы основные проблемы продукта. Если вы разрабатываете поведение Sluggable, для вас наиболее важно, чтобы строка slug была правильно сгенерирована на основе значений полей slugable, и поэтому вы должны протестировать ее. Конечно, вы можете проверить, правильно ли сохраняется значение поля slug в базе данных, но это не является основной задачей продукта, и это основная проблема самой Doctrine (и она уже проверена). - person iteman; 07.09.2011
comment
Да, но слаг создается после сохранения, поэтому, чтобы проверить, в порядке ли сгенерированная строка, мне нужно сохранить объект, а не проверять само сохранение (которое, конечно, тщательно проверяется Doctrine team), а для проверки сгенерированной строки, что является заботой системы. - person nerohc; 09.09.2011

namespace Ibw\JobeetBundle\Tests\Repository;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\Console\Input\ArrayInput;
use Doctrine\Bundle\DoctrineBundle\Command\DropDatabaseDoctrineCommand;
use Doctrine\Bundle\DoctrineBundle\Command\CreateDatabaseDoctrineCommand;
use Doctrine\Bundle\DoctrineBundle\Command\Proxy\CreateSchemaDoctrineCommand;

class CategoryRepositoryTest extends WebTestCase
{
    private $em;
    private $application;

    public function setUp()
    {
        static::$kernel = static::createKernel();
        static::$kernel->boot();

        $this->application = new Application(static::$kernel);

        // drop the database
        $command = new DropDatabaseDoctrineCommand();
        $this->application->add($command);
        $input = new ArrayInput(array(
            'command' => 'doctrine:database:drop',
            '--force' => true
        ));
        $command->run($input, new NullOutput());

        // we have to close the connection after dropping the database so we don't get "No database selected" error
        $connection = $this->application->getKernel()->getContainer()->get('doctrine')->getConnection();
        if ($connection->isConnected()) {
            $connection->close();
        }

        // create the database
        $command = new CreateDatabaseDoctrineCommand();
        $this->application->add($command);
        $input = new ArrayInput(array(
            'command' => 'doctrine:database:create',
        ));
        $command->run($input, new NullOutput());

        // create schema
        $command = new CreateSchemaDoctrineCommand();
        $this->application->add($command);
        $input = new ArrayInput(array(
            'command' => 'doctrine:schema:create',
        ));
        $command->run($input, new NullOutput());

        // get the Entity Manager
        $this->em = static::$kernel->getContainer()
            ->get('doctrine')
            ->getManager();

        // load fixtures
        $client = static::createClient();
        $loader = new \Symfony\Bridge\Doctrine\DataFixtures\ContainerAwareLoader($client->getContainer());
        $loader->loadFromDirectory(static::$kernel->locateResource('@IbwJobeetBundle/DataFixtures/ORM'));
        $purger = new \Doctrine\Common\DataFixtures\Purger\ORMPurger($this->em);
        $executor = new \Doctrine\Common\DataFixtures\Executor\ORMExecutor($this->em, $purger);
        $executor->execute($loader->getFixtures());
    }

    public function testFunction()
    {
          // here you test save any object or test insert any object 
    }

    protected function tearDown()
    {
        parent::tearDown();
        $this->em->close();
    }
}

как в этой ссылке: Jobeet Учебное пособие по модульному тестированию объясняет, как тестировать сущность и репозиторий сущностей.

person ahmed hamdy    schedule 18.11.2013
comment
Хотя теоретически это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. - person Xavi López; 18.11.2013