2011-09-06 29 views

risposta

21

Per testare i modelli, è possibile utilizzare il metodo setUp(). link to docs

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

Spero che questo ti aiuta

+0

Questo ha funzionato per me. Grazie. –

+1

E qui c'è un collegamento a docs @ symfony.com - http://symfony.com/doc/current/cookbook/testing/doctrine.html –

7

Si prevede che i modelli Symfony2 siano oggetti di dominio che rappresentano domain models nel codice.

dominio oggetti devono essere definiti esclusivamente per implementare il comportamento commerciale del concetto dominio corrispondente, anziché essere definita dalle esigenze di un quadro tecnologia più specifico. - Domain-driven design - Wikipedia, the free encyclopedia

oggetti di dominio (e le sue prove) non devono dipendere da API e API Symfony2 Dottrina, tranne se si vuole veramente per mettersi alla prova.

Scrivere test di unità di Symfony2 non è diverso rispetto alla scrittura di test di unità PHPUnit standard. - Symfony - Testing

È possibile verificare la logica di business (processi, regole, comportamenti, ecc) rappresentati in oggetti del dominio con PHPUnit (o Behat) e di solito test doubles.

+0

Sì, ho letto i documenti e capire questi concetti. Ma se voglio testare, ad esempio, il comportamento di Sluggable, funziona solo dopo che il record è stato salvato. Come posso testarlo? Non importa che il bundle sia probabilmente testato, voglio solo vedere come testare le cose in symfony2 – nerohc

+1

È importante per noi sapere quali sono le preoccupazioni principali del prodotto. Se si sta sviluppando il comportamento di Sluggable, è la cosa più importante per te che la stringa di slug sia generata correttamente in base ai valori dei campi di inserimento, e quindi testarlo. Ovviamente è possibile verificare se il valore del campo slug è memorizzato correttamente nel database, ma non è una preoccupazione principale del prodotto, ed è una preoccupazione principale di Doctrine stesso (ed è già stato testato). – iteman

+1

Sì, ma lo slug viene creato aftersave, quindi per verificare se la stringa generata è ok, ho * bisogno * di salvare l'oggetto, non di testare il salvataggio stesso (che ovviamente è molto testato dal team di Doctrine), ma per controllare la stringa generata, che è una preoccupazione del sistema. – nerohc

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

come in questo link: Jobeet Unit Test Tutorial spiegano come testare Entity e Entity Repository

+1

Anche se questo può teoricamente rispondere alla domanda, [sarebbe preferibile] (http: //meta.stackexchange.com/q/8259) per includere qui le parti essenziali della risposta e fornire il link per riferimento. –

Problemi correlati