2016-09-06 7 views
2

現在、私はSymfony2アプリケーションの受け入れテストケースを作成しています。私は次のことをやっている。symfony2受け入れテストが動作しない

namespace my\Bundle\ProjectBundle\Tests\Controller; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 

class DefaultControllerTest extends WebTestCase 
{ 
    public function testIndex() 
    { 
     $client = static::createClient(); 

     $client->request('GET', '/'); 

     $this->assertEquals(200, $client->getResponse()->getStatusCode()); 
    } 
} 

しかし、次のログファイルを調べると失敗します。

app/logs/test.log 

は、$_SERVER変数はそれにいくつかの値が欠落していることが表示されます

[2016-09-06 12:56:58] request.CRITICAL: Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: SERVER_PROTOCOL" at /var/www/src/my/Bundle/projectBundle/Helper/DataHelper.php line 139 {"exception":"[object] (PHPUnit_Framework_Error_Notice(code: 8): Undefined index: SERVER_PROTOCOL at /var/www/src/my/Bundle/projectBundle/Helper/DataHelper.php:139)"} [] 

ことが表示されます。テストケースを書く上での手がかりや、より良い方法があります。

DataHelper.php

public function getCanonicalUrl() 
    { 
     $router = $this->container->get('router'); 
     $req = $this->container->get('request'); 
     $route = $req->get('_route'); 
     if (!$route) { 
      return 'n/a'; 
     } 
     $url = $router->generate($route, $req->get('_route_params')); 
     $protocol = stripos($_SERVER['SERVER_PROTOCOL'], 'https') === true ? 'https://' : 'http://'; 
     return $protocol . ($this->getHostname() . $url); 
    } 
+0

は、なぜあなたは、引数としてHTTPS => trueを渡していますか? – COil

+0

@ Coilは本当に重要ですか?問題は? – bharatesh

+0

DataHelper.phpクラスのコードを表示できますか? – Matteo

答えて

0

はとにかく私は今のようにのために多かれ少なかれ回避策を見つけました。次の図のように、とにかくテストケースです。

namespace Chip\Bundle\PraxistippsBundle\Tests\Controller; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 

class DefaultControllerTest extends WebTestCase 
{ 
    public function testIndex() 
    { 
     $_SERVER['SERVER_PROTOCOL'] = 'http://'; 

     $client = static::createClient(); 

     $client->request('GET', '/'); 

     $this->assertEquals(200, $client->getResponse()->getStatusCode()); 
    } 
} 

次のようにも試みました。

Stackoverflow One more Answer

しかし正解は議論に開かれています。

+1

また、DataHelper.phpクラスを変更して、プロトコルキーが存在するかどうかをテストすることもできます。 – COil

+2

スーパーグローバル変数にまったく依存しないように完全に再実装することもできます。 – zerkms

+0

SERVER_PROTOCOLを取得すると、なぜリクエストスタックサービスを使用しないのですか? – COil

3

あなたのソリューションが動作しているが、より良いアプローチは、以下のようになります。

doc about symfony2 testing読む:リクエストについて

詳細を()メソッド:

要求の完全な署名( )メソッドは次のとおりです。

request(
    $method, 
    $uri, 
    array $parameters = array(), 
    array $files = array(), 
    array $server = array(), 
    $content = null, 
    $changeHistory = true 
) 

サーバー配列は、期待していた生の値です通常は superglobalの が見つかりました。

だから、おそらくよりクリーンなアプローチは次のようになります。

$client->request(
    'GET', 
    '/', 
    array(), 
    array(), 
    array(
     'SERVER_PROTOCOL'   => 'http://', 
    ) 
); 

一つの問題は、あなたがSERVER_PROTOCOL変数に設定されている価値についてである可能性があります。 to the docについて:

「SERVER_PROTOCOL」名前とページが要求された を介して情報プロトコルの改訂。すなわち「HTTP/1.0」。

実際の値は'HTTP/1.0'http://ではなく)です。エラーを生成するクラスDataHelper.phpを再度確認してください。

EDIT:順序でgetSchemeisSecure

、あなたはまた、リクエストのメソッドを呼び出すことができSymfony2の要求(このdocで)

// retrieve $_SERVER variables 
$request->server->get('HTTP_SERVER'); 

からHTTP_SERVER変数にアクセスすることができますこの情報を取得します(例えばRequestクラスのソースコードを確認してください)。おそらく、あなたの場合、getSchemeメソッドが必要です。例として:

$protocol = $req->getScheme(); 

・ホープこのヘルプは

+0

ありがとうございました。 – bharatesh

関連する問題