2017-05-30 2 views
0

Je suis un étudiant, et je suis assez nouveau pour php. Pour ma formation pratique, je suis obligé d'écrire des tests fonctionnels en utilisant PHPUnit sur un grand projet. Pour les 3 derniers jours, je suis coincé en essayant de travailler avec la base de données au cours des tests PHPUnit. Par exemple, j'ai fait des tests pour les utilisateurs de s'inscrire sur le site Web et de se connecter. Mais le problème était que les utilisateurs s'enregistrent, je dois les activer. J'ai réussi à utiliser crawler pour l'activer, mais ce serait beaucoup plus simple si je pouvais simplement accéder à la base de données, faire une requête et aller de l'avant avec des tests. Même en excluant cela, je voulais créer un simulacre (je crois que c'est comme ça) et lancer les tests dans la base de données pour ne pas avoir à utiliser le crawler et le long chemin pour se connecter en tant qu'administrateur.PHPUnit: Modifier l'entrée de la base de données pendant les tests fonctionnels en utilisant dbunit ou autre chose

Je ne suis pas assez habile pour savoir comment résoudre cette tâche. J'ai essayé d'installer dbUnit et de lire le tutoriel. Mais quand j'ai essayé de l'utiliser, je n'ai pas réussi à compléter quoi que ce soit. L'utilisation de SetUp() et TearDown() ne fonctionnait pas non plus.

Voici les liens que j'ai trouvé sur stackoverflow avec des questions similaires à la mienne: Delete test entity after testing with phpunit symfony -Ce type a presque la même utilisation de chenilles comme je le fais, mais je ne comprends pas la solution. Phpunit testing with database -La réponse ici est bonne, et c'est là que j'ai décidé d'obtenir dbunit. Cependant, je n'arrive pas à faire quoi que ce soit à cause de mon manque de compréhension.

De toute façon, voici mon code (dépouillé, comme j'ai 500 lignes de crawler rampant sur le site Web) J'exécute tous les tests dans une classe comme si elles courent l'une après l'autre je peux suivre le processus d'enregistrement, enregistrement dans et en supprimant. Si j'étais capable de savoir comment utiliser les interractions de la base de données entre la vie serait tellement plus facile. Edit: voici un code que je voudrais travailler par exemple mais je ne sais pas comment exécuter une requête. Notez à la fin où je voudrais changer le nom d'un utilisateur par exemple.

/** 
     * @var \Doctrine\ORM\EntityManager 
     */ 
     private $em; 

    /** 
    * {@inheritDoc} 
    */ 
    protected function setUp() 
    { 
     self::bootKernel(); 

     $this->em = static::$kernel->getContainer() 
      ->get('doctrine') 
      ->getManager(); 
    } 



    public function testUserRegister() //check if new artista can be registered 
    { 


     $client = static::createClient(); 
     $crawler=$client->request('GET', "/"); 
     // Create a new client to browse the application 
     $link = $crawler->filter('a:contains("Regístrate")')->eq(0)->link(); 
     $crawler = $client->click($link); 
     // var_dump($crawler->html()); 
     $this->assertEquals(1, $crawler->filter('h1:contains("REGISTRO")')->count()); 


     $buttonCrawlerNode = $crawler->selectButton("Entra"); 
     $form = $buttonCrawlerNode->form(); 
     $crawler->filter('#registro_category option:contains("Usuario")'); 

     $form['frontendbundle_artista[nombre]'] = 'Test404'; 
     $form['frontendbundle_artista[apellidos]'] = 'Test404'; 
     $form['frontendbundle_artista[email]'] = '[email protected]'; 
     $form['frontendbundle_artista[password][first]'] = 'Test404'; 
     $form['frontendbundle_artista[password][second]'] = 'Test404'; 
     $form['frontendbundle_artista[condiciones]'] ->tick(); 

     // submit the form 
     $client->followRedirects(); 
     $crawler = $client->submit($form); 

     $this->assertEquals(200, $client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET "); 
     $this->assertTrue($crawler->filter('body:contains("[email protected]")')->count() >= 1); //if user was created this will be true 

     $this->em 
      ->CreateQuery('UPDATE usuario SET nombre = \'Alfred Schmidt\' WHERE UsuarioID = 2106;') 
     ; 

     $client->getResponse()->getContent(); 
    } 
+0

Ce squelette de classe ne vous aide pas beaucoup. N'oubliez pas que nous ne connaissons pas le système sur lequel vous travaillez. Pouvez-vous afficher un message d'erreur et l'extrait de code correspondant (peut-être avec des parties inutiles commentées)? J'ai peur, dans l'état actuel des choses, de voter pour la clôture de cette question trop large. – dbrumann

+0

Fondamentalement, une chose qui m'aiderait avec tout est de savoir comment envoyer une requête DQL à la base de données au cours de tests fonctionnels avec PHPUnit. – demandingproblem

Répondre

0

est avec ce que j'ai pu résoudre tous mes problèmes:

$em = $client->getContainer()->get('doctrine.orm.entity_manager'); 
     $nombre = 'Test405'; 
     $usuario =$em->getRepository('AppBundle:usuario')->findOneByNombre($nombre); 
     $em->remove($usuario); 
     $em->flush();