4
use Liip\FunctionalTestBundle\Test\WebTestCase;

class ControllerTest extends WebTestCase
{
    public function testSuccess()
    {
        $url = $this->getContainer()->get('router')
            ->generate('name_route', array('parameter' => ' '));

        $this->client->request('GET', $url,
            array(),
            array(),
            array(
                'HTTP_parameter_Header' => 'paramterHeader',          
            )
        );
    }
}

テストを開始した後、エラーが発生しました。

非オブジェクトでのメンバー関数 getContainer() の呼び出し

4

4 に答える 4

3

内部でコンテナーを使用できるようにするには、WebTestCase最初に次のコマンドでカーネルを起動する必要があります。

static::bootKernel($options);
$container = static::$kernel->getContainer();
于 2016-01-29T13:33:43.717 に答える
1

まず、Symfony Testing ドキュメントのAccessing the Containerを見てください。

提供された回答は機能する可能性がありますが、 WebTestCaseクラスを拡張する場合は、クライアントを作成すると自動的に起動されるため、カーネルを特に起動する必要はありません。を使用しているようです。これは、関数$this->clientでクラスのグローバル クライアントを定義したことを意味しますsetUp()。その場合は、次のことを行う必要があります。

$container = $this->client->getContainer();
$url = $container->get('router')->generate('name_route', array('parameter' => ' '));

$this->clientどこにも定義していない場合は、上記を次のように変更する必要があります

// if your class extended Symfony's standard WebTestCase, this would 
// instead be $client = static::clientClient();
$client = static::makeClient();
$container = $this->client->getContainer();
$url = $container->get('router')->generate('name_route', array('parameter' => ' '));

Symfony のドキュメントには次のように記載されていることに注意してください。

機能テストではレスポンスのみをテストすることを強くお勧めします。しかし、非常にまれな特定の状況では、いくつかの内部オブジェクトにアクセスしてアサーションを書きたい場合があります。このような場合、依存性注入コンテナーにアクセスできます。

したがって、Symfony によれば、ルートを生成するためにコンテナに実際にアクセスするべきではありません。他のすべての例を見ると、ルートを名前で取得するのではなく、ルートのパスを呼び出すことを好むので、場合は次のようになります。

$this->client->request('GET', '/path/for/your/route',
    array(),
    array(),
    array(
        'HTTP_parameter_Header' => 'parameterHeader',          
    )
);
于 2016-01-29T15:30:03.643 に答える