2016-11-03 7 views
2

私のSymfony3アプリケーションの機能テストを書いています。私はこのようなテストを持っています:symfony3の機能テスト、フォーム送信後のコンテナへのアクセス

public function testList() 
{ 
    $client = static::createClient(); 
    $client->getCookieJar()->set($this->cookie); 

    $this->sender->method('isSuccessfull')->will($this->returnValue(true)); 

    $container = $client->getContainer(); 
    $container->set('app.service1', $this->object1); 
    $container->set('app.service2', $this->object2); 

    $crawler = $client->request('GET', '/list/1'); 
    $form = $crawler->selectButton('Save')->form(); 
    $client->submit($form); 

} 

フォームを提出するまではすべてが良いです。カーネルはフォームを送信している間に設定されたコンテナサービスを失います。フォームを提出した後も、これらのサービスはどのようにコンテナに入れることができますか?多分私の問題を解決するための他のオプションがありますか?

答えて

1

source code for Symfony\Component\HttpKernel\Client::doRequest() classにチェックを入れると、カーネルが終了し、後で再び起動されることがわかります。そのため、手動で作成したサービスがすべて失われてしまいます。

私はあなたがそのサービスをservices.ymlに追加できるようにテストしているアプリを持っていると思います。もう1つの方法は、クラスを自分自身でオーバーライドしてgetContainer()メソッドを拡張して、これらの余分なサービスを常に追加することです(カスタムクラスのコンパイルパスでtest.clientのサービス定義を更新する必要があります)。

+0

ありがとうございます。私のサービスは「本当の」サービスではありません。彼らは実際のサービスのモックです。 services_test.ymlでサービスのモックを渡す方法や拡張されたClientクラスでこれらのモックを追加する方法はありますか? – dtx

+0

通常の 'service.yml'をインポートする' test_service.yml'にそれらを追加することは 'Client'を拡張する方が簡単ですので、いくつか特別な機能が必要な場合を除き' yml'だけにします。 – martin

+0

私はそれを知っている:)しかし、サービスの議論としてモックを渡す方法は?上記のモックのコードでは、$ this-> object1と$ this-> object2です。 – dtx

関連する問題