2016-04-26 8 views
5

Staram się zrozumieć, co jest nie tak z moimi testami funkcjonalnymi lub ustawieniami projektu: wykonanie phpunit'a wypisuje następujące informacje (nie drukuję tego w zestaw testów - tzn. nie pochodzi od klienta-> getResponse() lub czegokolwiek). Dodatkowo cała wykonanie testu zatrzymuje się natychmiast, bez jakichkolwiek informacji wynikowej po ten tekst jest drukowany w wierszu poleceń:Test funkcjonalny Symfony2 wypisuje przekierowanie html i zatrzymuje wykonanie testu

<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> 

Po uruchomieniu PHPUnit z wiersza poleceń:

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

mojego kodu testu jest raczej prosty:

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

    //.... 
} 

Dodatkowo e xactly ten sam test działa dobrze na innym projekcie, nad którym pracuję, więc próbowałem odszukać różnice w konfiguracjach projektu itp. bez powodzenia.

Każda pomoc jest bardzo doceniana - możesz poprosić o inną zawartość pliku kodu/konfiguracji, jeśli jest to pomocne/istotne.

użyciu symfony 2.3.12 & PHPUnit 4.1.0

aktualizacja: specyficzny łańcuch kodu, który prowadzi do błędu

Więc po starają się obejść ten problem, rozwiązując kwestie leżące u podstaw projektu kilka sesji Kilka dni temu wróciłem do debugowania tego problemu jeszcze trochę dalej. I obecnie wydaje się, że wynik jest z powodu następującego łańcucha kodu, najpierw dzwoni do przodu:

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

aw przekazanych akcji kontrolera nazywając przekierować:

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

oczywiście przepływ ten kontroler wydaje się nieco dziwne ogólnie rzecz biorąc, ale pozostaje pytanie, dlaczego prowadzi to do zaobserwowanego wyniku?

+1

po stwierdzeniu, że poniższe wiersze nie zostały osiągnięte, pojawiają się asercje. Dodam je również do pytania – ejuhjav

+0

czy sprawdzasz z domyślnym serwerem WWW lub z apache? –

+0

@GaneshPatil Używam tego z linii poleceń z phpunit (zaktualizowałem pytanie) – ejuhjav

Odpowiedz

1

Można spróbować dodać niektóre kontrole w funkcji logowania:

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

dzięki za wysiłek, ale wynikowe zachowanie z tym pozostaje dokładnie takie samo. Wywołanie $ client-> submit ($ loginForm); nadal drukuje ten sam komunikat i przerywa wykonywanie testu. – ejuhjav

+0

@ejuhjav: Jeśli skomentujemy $ crawler = $ client-> submit ($ loginForm); ten kod, czy daje właściwy wynik dla wszystkich pozostałych twierdzeń? –

+0

@GaneshPatil '$ crawler' nie zostanie zdefiniowany, spowoduje błąd PHP. –

2

miałem ten problem przy logowaniu-in w teście funkcjonalnym (official doc), kiedy wykonywał po raz drugi $client->request(...). Oddzielenie tych pojedynczych testów we własnych klasach testowych nie rozwiązało problemu.

Rozwiązałem to przez , a nie ustawienie pliku cookie. Na szczęście moje testy nie zależały od cookie, więc wszystkie testy przeszły pomyślnie.

Może ta informacja pomogłaby ci lepiej wyizolować swój problem.

+1

dziękuję za odpowiedź: udało mi się obejść ten problem kilka dni temu, sortując zarządzanie sesją, które zostało wykonane w projekcie z happy mix, używając sesji od żądania i php standardowych funkcji sesji (jak session_id() - który nie uzyskał dostępu do tej samej sesji w środowisku testowym). Powróciłem do tego oryginalnego wydania i dokładniej wskazałem winowajcę; zaktualizowałem moje pytanie, ponieważ wciąż nie wiem, jaki jest dokładny powód do tego, aby doprowadzić do tego wyniku. – ejuhjav

+0

Mam ten sam problem i myślę, że jest to spowodowane faktem, że testuję sesję flashbag podczas przekierowania. Wykonanie jest w porządku, a test przechodzi, ale nadal ma nieprzyjemne wyjście html. –

1

miałem ten problem z kodem testowania

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

biegałam tablicę względnych adresów URL za pośrednictwem tego dochodzić. Jeden z adresów URL nie powiódł się, a moja aplikacja miała przekierowanie do tej sprawy.Zamiast pomijać twierdzenie, phpunit wypuszcza kod html RedirectResponse i umiera.

Powiązane problemy