13 Stimmen

Wie man Symfony2-Modelle mit PHPUnit testet

Ich habe versucht, ein Modell in einem Symfony2-Projekt zu testen, aber ich weiß nicht, wie man den Entity-Manager zum Speichern und Abrufen von Datensätzen zu erhalten.

Kann mir jemand einen Hinweis auf die richtigen Dokumente dafür geben?

21voto

Benjamin Lazarecki Punkte 2940

Um Ihre Modelle zu testen, können Sie die Methode setUp() verwenden. Link zu Dokumenten

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);
    }

Ich hoffe, das hilft Ihnen

7voto

iteman Punkte 614

Von Symfony2-Modellen wird erwartet, dass sie Domänenobjekte sind, die Folgendes darstellen Domänenmodelle im Code.

Domänenobjekte sollten de Verhalten des entsprechenden Domänenkonzepts zu implementieren, anstatt durch die Anforderungen eines spezifischeren technologischen Rahmens. -- Domänenorientiertes Design - Wikipedia, die freie Enzyklopädie

Domänenobjekte (und ihre Tests) sollten nicht von Symfony2-APIs und Doctrine-APIs abhängen, es sei denn, Sie wollen sie wirklich testen.

Das Schreiben von Symfony2-Unit-Tests ist nicht anders als das Schreiben von Standard-PHPUnit-Unit-Tests. -- Symfony - Testen

Sie können Geschäftslogik (Prozesse, Regeln, Verhaltensweisen usw.), die in Domänenobjekten dargestellt ist, mit PHPUnit (oder Behat) testen und normalerweise Prüfdoppel .

2voto

ahmed hamdy Punkte 4806
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();
    }
}

wie in diesem Link: Jobeet Unit Test Tutorial erklären, wie man Entitäten und Entitäten-Repository testet

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X