2015-11-06 10 views
5

Vedo che ci sono diversi modi per caricare i dati delle fixture in un database. Ma dopo un test funzionale, qual è il modo migliore/standard per confermare ciò che è stato scritto nel database era corretto?Per il test funzionale di Symfony2, qual è la procedura migliore per verificare i contenuti del database?

Il pacchetto phpunit ha un'intera sezione per questo, in cui è possibile caricare un set di dati e quindi utilizzare cose come assertTablesEqual() per confrontare il contenuto di una tabella con i contenuti previsti. Ma questo non sembra essere utilizzabile con Symfony2 e non riesco a trovare nessun altro metodo standard.

Come gli altri risolvono questo problema?

+0

correlati: http://stackoverflow.com/questions/10784973/how-to-set-up-database-heavy-unit-tests-in-symfony2-using-phpunit – k0pernikus

+0

ho visto questa domanda, ma sfortunatamente si tratta di creare l'apparecchio e non confermare i risultati dopo un test funzionale, a meno che non manchi qualche aspetto della risposta. – Nairebis

+2

Non si tratta solo di creare proiettori. Questo è solo il tuo punto di partenza. Per un test funzionale sul lato DB, è necessario creare un DB al volo, eseguire i test e quindi distruggere il DB di test. All'interno del test funzionale puoi anche interrogare il tuo DB e verificare i valori. Poiché non penso che dovresti testare il contenuto acutico del DB, ma se il tuo repository restituisce i dati corretti dopo che alcuni servizi hanno scritto nel DB. Ricordare che il processo di installazione e smontaggio deve essere eseguito per ogni caso di test e che il test di funzionamento può richiedere molto tempo. – k0pernikus

risposta

1

Symfony2 utilizza doctrine ORM per impostazione predefinita oppure è possibile impostare altre gestion del database (MongoDB per esempio). Controllare il file app\config\parameters.php per impostare la connessione al database e lo app\config\config.php per controllare/impostare il tipo di gestione. Con un ORM, non è necessario controllare un sacco di cose come il pacchetto phpunit, perché è già integrato nel protocolo e molto altro. Check here for more details.

Se si desidera caricare datafixtures, è possibile esportare il database effettivo per salvarlo oppure crearne uno nuovo solo per testare e cambiare database nello app\config\parameters.php creando uno nuovo come questo app\config\parameters_dev.php. In questo caso, il sito Web e la versione locale non utilizzeranno lo stesso database. È anche possibile modificare il app\config\parameters.php e impedire di caricarlo con il file .gitgnore.

+0

Grazie per la risposta! Ma non è davvero il nocciolo della questione, che sta facendo un test di verifica sui risultati di un test funzionale. Diciamo che carico il mio database di test, eseguo il mio metodo funzionale sotto test e poi ho nuove righe in 10 tabelle che devono avere il loro contenuto confermato per essere corretto. Come si fa normalmente? phpunit ha [tutto questo meccanismo per farlo] (https://phpunit.de/manual/current/en/database.html). – Nairebis

+0

Controllare le informazioni del database è una cattiva pratica in Symfony2, soprattutto per modificarle. Le Entites dovrebbero essere l'unica cosa che puoi toccare, puoi usare [doctrine events] (http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html) come pre-aggiornamento o postupdate per controllare le informazioni, ma non fare mai query nel database bypassando la gestione della dottrina. – user3504263

+0

L'oggetto è in fase di test, in cui devo confermare i risultati di un test funzionale. Gli eventi di dottrina non sono veramente rilevanti per questo. La domanda è scrivere asserzioni in una classe di test funzionale che convalida i risultati del database. – Nairebis

0

Ecco un esempio di un set di test che include i risultati del database. Se è necessario interagire direttamente con il database nel test, il gestore di entità può essere reso disponibile per il test. Per ulteriori informazioni, vedere this bit of documentation. Si noti che i risultati vengono solitamente presentati in una pagina Web e letti dal crawler DOM.

public function setUp() 
{ 
    self::bootKernel(); 
    $this->em = static::$kernel->getContainer() 
      ->get('doctrine') 
      ->getManager() 
    ; 
    $this->tool = static::$kernel->getContainer() 
      ->get('truckee.toolbox') 
    ; 

    $classes = array(
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadFocusSkillData', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadMinimumData', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadStaffUserGlenshire', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadStaffUserMelanzane', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadOpportunity', 
     'Truckee\VolunteerBundle\DataFixtures\SampleData\LoadVolunteer', 
    ); 
    $this->loadFixtures($classes); 
    $this->client = $this->createClient(); 
    $this->client->followRedirects(); 
} 

public function testOutboxUser() 
{ 
    $crawler = $this->login('admin'); 
    $link = $crawler->selectLink("Send alerts to organizations")->link(); 
    $crawler = $this->client->click($link); 
    $outboxObj = $this->em->getRepository('TruckeeVolunteerBundle:AdminOutbox')->findAll(); 
    $outbox = $outboxObj[0]; 
    $recipient = $outbox->getRecipientId(); 
    $type = $this->tool->getTypeFromId($recipient); 

    $this->assertEquals('staff', $type); 
}