2011-09-06 19 views

Respuesta

21

Para probar sus modelos, puede usar el método 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); 
     } 

la esperanza que esto le ayuda

+0

Esto funcionó para mí. Gracias. –

+1

Y aquí hay un enlace a los documentos @ symfony.com - http://symfony.com/doc/current/cookbook/testing/doctrine.html –

7

Se espera que los modelos Symfony2 sean objetos de dominio que representan domain models en el código.

objetos de dominio deben definirse exclusivamente para implementar el comportamiento empresarial del concepto de dominio correspondiente, en lugar de ser definido por los requisitos de un marco de tecnología más específica. - Domain-driven design - Wikipedia, the free encyclopedia

objetos de dominio (y sus pruebas) no deben depender de las API de Symfony2 y APIs Doctrina excepto si realmente quiere ponerse a prueba.

Escribir las pruebas de la unidad Symfony2 no es diferente de escribir las pruebas estándar de la unidad PHPUnit. - Symfony - Testing

Puede probar la lógica de negocio (procesos, normas, comportamientos, etc.) representados en los objetos de dominio con PHPUnit (o Behat) y por lo general test doubles.

+0

Sí, he leído los documentos y entender estos conceptos. Pero si quiero probar, por ejemplo, el comportamiento Sluggable, solo funciona después de guardar el registro. ¿Cómo puedo probar eso? no importa que el paquete probablemente esté probado, solo quiero ver cómo probar cosas en symfony2 – nerohc

+1

Es importante para nosotros saber cuáles son las principales preocupaciones del producto. Si está desarrollando el comportamiento Sluggable, es lo más importante para usted que la cadena de slug se genere correctamente en función de los valores de los campos sluggable, por lo que debe probarlo. Por supuesto, puede probar si el valor del campo slug está almacenado correctamente en la base de datos, pero no es una preocupación central del producto, y es una preocupación central de Doctrine (y ya está probado). – iteman

+1

Sí, pero la babosa se crea después de guardar, por lo que para probar si la cadena generada está bien, * necesito * guardar el objeto, no para probar el propio ahorro (que por supuesto está muy probado por el equipo de Doctrine), pero para verificar la cadena generada, que es una preocupación 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(); 
    } 
} 

como en este enlace: Jobeet Unit Test Tutorial explicando como se prueba entidad y entidad del repositorio

+1

Si bien esto puede responder teóricamente a la pregunta, [sería preferible] (http: //meta.stackexchange.com/q/8259) para incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia. –

Cuestiones relacionadas