2011-09-06 17 views

Odpowiedz

21

Aby przetestować modele, można użyć metody 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); 
     } 

Nadzieja to pomaga

+0

To zadziałało dla mnie. Dzięki. –

+1

A oto link do dokumentu docs @ symfony.com - http://symfony.com/doc/current/cookbook/testing/doctrine.html –

7

Oczekuje się, że modele Symfony2 będą obiektami domeny reprezentującymi kod domain models.

obiektów domeny powinny być określone wyłącznie w celu realizacji zachowań biznesowych odpowiedniego pojęcia domeny, zamiast być zdefiniowane wymaganiami bardziej konkretnych ram technologii. - Domain-driven design - Wikipedia, the free encyclopedia

obiektów domeny (i jego testy) nie powinna zależeć od API Symfony2 i API Doktryny wyjątkiem, jeśli naprawdę chcesz się sprawdzić.

Pisanie testów jednostkowych Symfony2 nie różni się od pisania standardowych testów jednostek PHPUnit. - Symfony - Testing

można przetestować logikę biznesową (procesy, zasady, zachowania, itp) reprezentowane w obiektów domeny z PHPUnit (lub Behat) i zazwyczaj test doubles.

+0

Tak, przeczytałem docs i zrozumienie tych pojęć. Ale jeśli chcę przetestować na przykład zachowanie Sluggable, działa to tylko po zapisaniu rekordu. Jak mogę to przetestować? nieważne, że pakiet jest prawdopodobnie testowany, po prostu chcę zobaczyć, jak przetestować rzeczy w symfony2 – nerohc

+1

Ważne jest, abyśmy wiedzieli, jakie są główne kwestie związane z produktem. Jeśli opracowujesz zachowanie Sluggable, najważniejsze jest, aby ciąg slugów był poprawnie generowany na podstawie wartości pól, które można usunąć, i przetestować go. Oczywiście możesz sprawdzić, czy wartość pola slug jest poprawnie zapisana w bazie danych, ale nie jest to podstawowa troska o produkt i jest to główny problem samej Doctrine (i jest już przetestowany). – iteman

+1

Tak, ale pocisk jest tworzony po deszczu, więc aby sprawdzić, czy wygenerowany ciąg jest w porządku, * trzeba * zapisać obiekt, nie testować samego zapisu (który oczywiście jest bardzo przetestowany przez zespół Doctrine), ale aby sprawdzić wygenerowany ciąg, który jest problemem systemu. – 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(); 
    } 
} 

jak w ten link: Jobeet Unit Test Tutorial wyjaśnić, jak testować Entity i Entity repozytorium za

+1

Chociaż może to teoretycznie odpowiedzieć na pytanie, [byłoby lepiej (http: //meta.stackexchange.com/q/8259), aby uwzględnić istotne części odpowiedzi tutaj, i podać link do odniesienia. –

Powiązane problemy