2016-04-26 5 views
5

phpunitの実行では、機能テストやプロジェクト設定が間違っていることを理解するのに苦労しています。テストスイート - つまり、クライアントからのgetResponse()の印刷などではありません。Symfony2の機能テストは、リダイレクトhtmlを出力してテストの実行を停止します。

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

私のテストコード:コマンドラインからのPHPUnitを実行した後

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

:このテキストは、コマンドラインにプリントアウトされた後、さらに全体のテストの実行には、任意の結果情報なしですぐに停止しむしろ単純です:

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

    //.... 
} 

さらに、e xactly同じテストケースが私が作業している別のプロジェクトでうまく動作しているので、私はプロジェクトの設定などの違いを幸運にも掘り下げようとしています。

お手数ですが、参考になる場合は、他のコード/設定ファイルの内容をお気軽にお問い合わせください。特定のコード・チェーン

だから、基本的なプロジェクトセッションの問題のカップルを解くことによって、この問題を回避するために管理した後にエラーにつながる:4.1.0

が更新のsymfony 2.3.12 &のPHPUnitを使用して

数日前、私はこの問題をさらに少しデバッグするために戻った。明らかにこのコントローラの流れは少し奇妙に思える

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

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

とリダイレクト呼び出し転送コントローラのアクションで:そして現在、最初に前方の呼び出し、結果が原因次のコード・チェーンにあるようです一般的には、これは観察された結果につながるのはなぜですか?

+1

アサーションは、行の下に到達しないというコメントの後に来ます。私も質問にそれらを追加します – ejuhjav

+0

あなたはデフォルトのWebサーバーまたはApacheでチェックしていますか? –

+0

@GaneshPatil私はこれをphpunitコマンドラインから実行しています(質問を更新しました) – ejuhjav

答えて

1

あなたは、ログイン機能でいくつかのチェックを追加しようとすることができます

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

努力をいただきありがとうございますが、これによる結果の動作はまったく同じです。 $ client-> submit($ loginForm)の呼び出し。それでも同じメッセージが出力され、テストの実行が中断されます。 – ejuhjav

+0

@ejuhjav:$ crawler = $ client-> submit($ loginForm)とコメントした場合。このコードは、残りのすべてのアサーションに対して正しい結果を与えていますか? –

+0

@GaneshPatil '$ crawler'は定義されません。PHPのエラーが発生します。 –

2

ログインイン時に機能テスト(official doc)で、私は$client->request(...)秒の時間を実行していたとき、私は、この問題を抱えていました。個別のテストクラスでこれらの単一のテストを分離しても問題は解決しませんでした。

私はこれをで解決しました。はクッキーを設定しています。幸運にも私のテストはクッキーに依存していなかったので、すべてのテストが合格しました。

この情報は、あなたの問題をより明確にするのに役立ちます。

+1

答えに感謝:私は数日前に、リクエストとPHP標準セッション関数(session_id()など)からセッションを使用して幸せなミックスでプロジェクトで行われたセッション管理を整理して、テスト環境では同じセッションにアクセスしませんでした)。私は今この元の問題に戻り、より詳細な原因を突き止めました。私はこの結果につながる正確な理由が何であるかまだ分かりませんので、私の質問を更新しました。 – ejuhjav

+0

私は同じ問題を抱えています。リダイレクト中にセッションのフラッシュバックをテストしているという事実が原因です。実行は問題なく、テストは合格しますが、まだ醜いhtml出力があります。 –

1

私はこのアサートを通じて相対URLの配列を実行していたテストコード

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

で、この問題を持っていました。 URLの1つがうまくいかず、私のアプリケーションはそのケースのリダイレクトを持っていました。アサートに失敗する代わりに、phpunitはRedirectResponseのhtmlコードを吐き出して終了します。

関連する問題