2016-04-26 1 views
5

J'ai du mal à comprendre ce qui ne va pas avec mes tests fonctionnels ou mes paramètres de projet: l'exécution de phpunit affiche simplement les informations suivantes (je n'imprime pas cela dans le suite de tests - c'est-à-dire qu'elle ne vient pas de l'impression client-> getResponse() ou autre chose). De plus, l'ensemble de l'exécution de test arrête immédiatement sans aucune information de résultat après ce texte est imprimé à la ligne de commande:Le test fonctionnel de Symfony2 imprime le html de redirection et arrête l'exécution du test

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta http-equiv="refresh" content="1;url=/" /> 

     <title>Redirecting to /</title> 
    </head> 
    <body> 
     Redirecting to <a href="/">/</a>. 
    </body> 
</html> 

Après avoir exécuté phpunit de la ligne de commande:

phpunit -c app --group temp1 src/AppBundle/Tests/Controller/SecurityControllerTest.php 

Mon code de test est plutôt simple:

class SecurityControllerTest extends WebTestCase 
{ 
    /** 
    * test login with succesfull case 
    * 
    * @group login 
    * @group temp1 
    */ 
    public function testLogin_success() 
    { 
     $client = static::createClient(); 
     $crawler = $client->request('GET', '/'); 

     // temp - just to test that the initial crawler location is correct 
     $this->assertGreaterThan(0, $crawler->filter('html:contains("System Login")')->count(), "login page not found"); 

     $client->followRedirects(true); 

     $crawler = $this->loginSubmit($client, $crawler, "[email protected]", "basic_user1_password"); 
     // THE BELOW ROWS ARE NEVER REACHED 

     // test that the user can access the user home 
     $crawler = $client->request('GET', '/user/myprofile'); 
     $this->assertGreaterThan(0, $crawler->filter('html:contains("Welcome to your user profile")')->count(), "User homepage not accessible after login"); 
    } 

    private function loginSubmit($client, $crawler, $username, $password) 
    {   
     $loginButton = $crawler->selectButton('Login'); 
     $loginForm = $loginButton->form(); 
     $loginForm['form[email]'] = $username; 
     $loginForm['form[password]'] = $password; 

     // BELOW IS THE ROW THAT RESULTS IN THE PRINTOUT + TEST EXECUTION STOP 
     return $client->submit($loginForm); 
    } 

    //.... 
} 

En outre, le e Le même cas de test fonctionne bien sur un autre projet sur lequel je travaille donc j'ai essayé de creuser les différences dans les configurations du projet, etc. sans trop de chance.

Toute aide est grandement appréciée - n'hésitez pas à demander un autre contenu de fichier de code/configuration si cela peut être utile/pertinent.

utilisant symfony 2.3.12 & PHPUnit 4.1.0

Mis à jour: chaîne de code spécifique qui conduit à l'erreur

Alors après avoir réussi à contourner ce problème en résolvant le couple des questions de la session du projet sous-jacent d'il y a quelques jours, je suis retourné pour déboguer ce problème un peu plus loin. Et actuellement, il semble que le résultat est dû à la chaîne de code suivant, appelant d'abord en avant:

$this->forward('bundle:controller:action')->send(); 

et dans l'action du contrôleur transmis appelant redirect:

$this->redirect($this->generateUrl($route, $parameters))->send(); 

évidemment ce flux de commande semble un peu étrange en général, mais la question demeure encore pourquoi cela conduit dans le résultat observé?

+1

les assertions viennent après le commentaire que les lignes ci-dessous ne sont jamais atteintes. Je vais ajouter ceux à la question ainsi – ejuhjav

+0

vérifiez-vous avec le serveur web par défaut ou avec apache? –

+0

@GaneshPatil Je l'exécute à partir de la ligne de commande avec phpunit (mis à jour la question) – ejuhjav

Répondre

1

Vous pouvez essayer d'ajouter des contrôles dans la fonction de connexion:

private function loginSubmit($client, $crawler, $username, $password) 
{ 
    // Check that the HTTP status is good. 
    $this->assertEquals(200, $client->getResponse()->getStatusCode()); 

    // Check that there is a form. 
    $this->assertEquals(1, $crawler->filter('form')->count()); 

    $loginButton = $crawler->selectButton('Login'); 
    $loginForm = $loginButton->form(); 
    $loginForm['form[email]'] = $username; 
    $loginForm['form[password]'] = $password; 

    // BELOW IS THE ROW THAT RESULTS IN THE PRINTOUT + TEST EXECUTION STOP 
    $crawler = $client->submit($loginForm); 

    // Check that the HTTP status is good. 
    $this->assertEquals(200, $client->getResponse()->getStatusCode()); 

    // Check that the login is successful, it depends on your code. 
    // For example if you show a message "Logged in succesfully." in a <div>: 
    $this->assertEquals(1, $crawler->filter('div:contains("Logged in succesfully.")')->count()); 

    // If nothing works, display the rendered HTML to see if there is an error: 
    // die($this->client->getResponse()->getContent()); 

    return $crawler; 
} 
+0

merci pour l'effort, mais le comportement qui en résulte reste exactement le même. L'invocation de $ client-> submit ($ loginForm); imprime toujours le même message et interrompt l'exécution du test. – ejuhjav

+0

@ejuhjav: Si on commente $ crawler = $ client-> submit ($ loginForm); ce code donne-t-il un bon résultat pour toutes les assertions restantes? –

+0

@GaneshPatil '$ crawler' ne sera pas défini, il va lancer une erreur PHP. –

2

J'ai eu ce problème lors de la connexion dans un test fonctionnel (official doc), quand j'exécutais la deuxième fois un $client->request(...). Séparer ces tests uniques dans les propres classes de test n'a pas résolu le problème.

J'ai résolu cela par pas en réglant un cookie. Heureusement mes tests ne dépendaient pas d'un cookie, donc tous les tests ont passé. Cette information pourrait vous aider à mieux isoler votre problème.

+1

merci pour la réponse: J'ai réussi à contourner le problème il ya quelques jours avec la gestion de session qui a été faite dans le projet avec un bon mélange en utilisant la session de requête et les fonctions de session standard PHP (comme session_id() - qui n'a pas accédé à la même session dans l'environnement de test). Je suis retourné maintenant à ce numéro original et ai identifié le coupable dans plus de détails; mis à jour ma question car je ne sais toujours pas quelle est la raison exacte pour mener à ce résultat. – ejuhjav

+0

J'ai le même problème et je pense qu'il est causé par le fait que je teste le flashbag de session pendant une redirection. L'exécution est bonne et le test passe mais il a toujours la sortie html laide. –

1

J'ai eu ce problème avec le code de test

$this->assertTrue($client->getResponse()->isSuccessful()); 

je courais un tableau de urls par rapport à travers cette assertion. L'une des urls n'a pas abouti et ma demande a été redirigée pour ce cas.Au lieu d'échouer à l'assertion, phpunit crache le code html RedirectResponse et meurt.