2016-04-26 10 views
5

Sto faticando a capire cosa c'è di sbagliato nel mio test funzionale o nelle impostazioni del progetto: l'esecuzione di phpunit stampa solo le seguenti informazioni (non lo sto stampando nel test suite - cioè non proviene dalla stampa client-> getResponse() o altro). Inoltre l'intera esecuzione del test si arresta immediatamente senza alcuna informazione risultato dopo questo testo viene stampato alla riga di comando:Il test funzionale Symfony2 stampa redirect html e interrompe l'esecuzione del 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> 

Dopo l'esecuzione phpunit da linea di comando:

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

Il mio codice di prova è piuttosto semplice:

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); 
    } 

    //.... 
} 

Inoltre la e Lo stesso identico caso di test sta funzionando bene su un altro progetto su cui sto lavorando, quindi ho cercato di scavare le differenze nelle configurazioni del progetto, ecc. senza fortuna.

Qualsiasi aiuto è molto apprezzato: non esitate a chiedere altri contenuti del file di configurazione/codice se ciò potrebbe essere utile/pertinente.

utilizzando symfony 2.3.12 & phpunit 4.1.0

aggiornamento: catena di codice specifico che porta all'errore

Così dopo essere riuscito a risolvere questo problema risolvendo il progetto sottostante problemi di sessione paio di giorni fa, sono tornato a eseguire il debug di questo problema ancora un po 'oltre. E attualmente sembra che il risultato è dovuto al seguente catena di codice, prima di chiamare in avanti:

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

e nell'azione di controllo inoltrato chiamando redirect:

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

ovviamente questo flusso di controllo sembra un po 'strano in generale, ma rimane ancora la domanda perché questo porta al risultato osservato?

+1

le affermazioni vengono dopo il commento che le righe inferiori non vengono mai raggiunte. Aggiungerò anche quelli alla domanda – ejuhjav

+0

stai verificando con il server web predefinito o con apache? –

+0

@GaneshPatil Sto eseguendo questo da dalla riga di comando con phpunit (aggiornato la domanda) – ejuhjav

risposta

1

Si può provare ad aggiungere alcuni controlli nella funzione di login:

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

grazie per lo sforzo, ma il comportamento risultante con questo rimane esattamente lo stesso. L'invocazione di $ client-> submit ($ loginForm); stampa ancora lo stesso messaggio e interrompe l'esecuzione del test. – ejuhjav

+0

@ejuhjav: Se commentiamo $ crawler = $ client-> submit ($ loginForm); questo codice, sta dando il giusto risultato per tutte le asserzioni rimanenti? –

+0

@GaneshPatil '$ crawler' non sarà definito, genererà un errore PHP. –

2

Ho avuto questo problema quando si accede-in in un test funzionale (official doc), quando mi stava eseguendo la seconda volta che un $client->request(...). Separare quei singoli test nelle proprie classi di test non ha risolto il problema.

Ho risolto questo non impostando un cookie. Fortunatamente i miei test non dipendevano da un cookie, quindi tutti i test sono passati.

Forse questa informazione potrebbe aiutarti a isolare ulteriormente il problema.

+1

grazie per la risposta: sono riuscito a risolvere il problema alcuni giorni fa con la gestione della sessione che è stata fatta nel progetto con un mix felice utilizzando la sessione dalla richiesta e le funzioni di sessione standard di php (come session_id() - che non ha avuto accesso alla stessa sessione nell'ambiente di test). Sono tornato ora a questo numero originale e ho individuato il colpevole in maggiori dettagli; Ho aggiornato la mia domanda in quanto non so ancora quale sia la ragione esatta per portare a questo risultato. – ejuhjav

+0

Ho lo stesso problema e penso che sia causato dal fatto che sto testando la sessione flashbag durante un reindirizzamento. L'esecuzione è a posto e il test passa ma ha ancora l'orribile output html. –

1

Ho avuto questo problema con il codice di test

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

correvo un array di URL relativi attraverso questa asserzione. Uno degli URL non ha avuto successo e la mia richiesta ha avuto un reindirizzamento per quel caso.Invece di fallire nell'asserzione, phpunit sputa fuori il codice html di RedirectResponse e muore.

Problemi correlati