2017-02-01 11 views
3

私たちはPHPUnitを使ってアプリケーションの部分をテストしています。いくつかのテストでは、パラメータの値を変更するか、サービスをオーバーライドしたい(ただし、そのテストの場合のみ、はすべてのテストではない)。)。PHPUnitテストでSymfonyのパラメータやサービスを設定するには?

Symfonyのコンテナをテスト中に即座に設定するには、どのような方法が推奨されますか?

私たちが遭遇した問題は、ファイルが変更されたときにのみ再コンパイルするため、コンフィギュアがオンザフライで設定されているときにコンテナが再コンパイルされないということです。

+0

あなたは 'ます$ this->クライアント - のような何かを試みることができます> getContainer() - > set( 'application.facebook_guzzle'、$ client); 'これはうまくいきません... – Matteo

+2

@Matteoこれはパラメータでは機能しません(コンテナがコンパイルされているため) –

答えて

3

これは、我々が今の進め方です:

class TestKernel extends \AppKernel 
{ 
    public function __construct(\Closure $containerConfigurator, $environment = 'test', $debug = false) 
    { 
     $this->containerConfigurator = $containerConfigurator; 

     parent::__construct($environment, $debug); 
    } 

    public function registerContainerConfiguration(LoaderInterface $loader) 
    { 
     parent::registerContainerConfiguration($loader); 
     $loader->load($this->containerConfigurator); 
    } 

    /** 
    * Override the parent method to force recompiling the container. 
    * For performance reasons the container is also not dumped to disk. 
    */ 
    protected function initializeContainer() 
    { 
     $this->container = $this->buildContainer(); 
     $this->container->compile(); 
     $this->container->set('kernel', $this); 
    } 
} 

その後、我々はPHPUnitの基本テストクラスでこのメソッドを追加しました:

/** 
* Rebuilds the container with custom container configuration. 
* 
* @param \Closure $containerConfigurator Closure that takes the ContainerBuilder and configures it. 
* 
* Example: 
* 
*  $this->rebuildContainer(function (ContainerBuilder $container) { 
*   $container->setParameter('foo', 'bar'); 
*  }); 
*/ 
public function rebuildContainer(\Closure $containerConfigurator) : ContainerInterface 
{ 
    if ($this->kernel) { 
     $this->kernel->shutdown(); 
     $this->kernel = null; 
     $this->container = null; 
    } 

    $this->kernel = new TestKernel($containerConfigurator); 
    $this->kernel->boot(); 
    $this->container = $this->kernel->getContainer(); 

    return $this->container; 
} 
0

ユニットテストでコンテナまたは設定をテストしません。 ユニットテストでは、目的は、完全なアプリケーションスタックなしでカプセル化されたユニットをテストすることです。機能テストのために

推奨される方法はconfig_dev.ymlからのすべての値が上書きすることができますapp/config/config_test.yml

の下で継承された設定でそれを編集することです。

+0

テストベースによるテストの手助け? – Cerad

+0

ユニットテストでは、Container/Configをまったく信頼しないでください。 Symfonyでの機能テストでは、PhpUnitも使用しています。これは正しい方法です:https://symfony.com/doc/current/testing.html#functional-tests – mblaettermann

+1

あなたはその質問を読んだことがありますか? PHPunitが使用されているという事実は単体テストを意味するものではありません。あなたの提案した解決策はナンセンスです。それに応じてダウン投票。 – Cerad

-1

$ serializer = new \ JMS \ Serializer \ SerializerBuilder();$ container-> set( 'jms_serializer'、$ serializer :: create() - > build());

+0

投稿したコメントをご覧ください。また、 'set()'の呼び出しの前にサービスがすでに注入されている場合、これは機能しません。 –

関連する問題