2017-06-07 8 views
7

テスト環境でモックアウトする必要があるサードパーティAPIに依存するコントローラーの一連のテストがあります。機能テストクライアントのクローラをオーバーライドし、テストする必要がある依存関係を模擬します。ここでの鍵は、すべてのテストでモックが変わることです。コントローラーテストでSymfony 3.3コンテナーサービスを上書きする

例コントローラテストケース:

class MyControllerTest extends WebTestCase 
{ 
    private static $kernelModifier = null; 

    public function setKernelModifier(\Closure $kernelModifier) 
    { 
     self::$kernelModifier = $kernelModifier; 
     $this->ensureKernelShutdown(); 
    } 

    protected static function createClient(array $options = [], array $server = []) 
    { 
     static::bootKernel($options); 

     if ($kernelModifier = self::$kernelModifier) { 
      $kernelModifier->__invoke(); 
      self::$kernelModifier = null; 
     }; 

     $client = static::$kernel->getContainer()->get('test.client'); 
     $client->setServerParameters($server); 

     return $client; 
    } 

    protected function getPropertyClient() 
    { 
     $mockService = (new PropertyMock())->getPropertyMock(); 
     $this->setKernelModifier(function() use ($mockService) { 
      static::$kernel->getContainer()->set('app.property_service', $mockService); 
     }); 
     return static::createClient(); 
    } 

    protected function getPropertyFailureClient() 
    { 
     $mockService = (new PropertyMock())->getPropertyFailureMock(); 
     $this->setKernelModifier(function() use ($mockService) { 
      static::$kernel->getContainer()->set('app.property_service', $mockService); 
     }); 
     return static::createClient(); 
    } 
} 

実際によるサービスが現在注入されるように

はsymfony 3.2で、これはうまく働いたが、symfonyの3.3に私は非推奨警告の数を有しますテスト:

public function testInvalidPropertyRequest() 
{ 
    $client = $this->getPropertyClient(); 
    $client->request(
     'POST', 
     '/webhook/property', 
     [], 
     [], 
     [], 
     '' 
    ); 
    $this->assertEquals(400, $client->getResponse()->getStatusCode()); 
} 

廃止エラー:

Setting the "app.property_service" pre-defined service is deprecated since Symfony 3.3 and won't be supported anymore in Symfony 4.0: 3x

私は、3.3リリースのドキュメント、BCブレーク、廃止を経ており、設定後にコンテナサービスをモックに置き換える方法を理解できません。

何か助けていただければ幸いです。

+0

これはおそらくあなたを助けることができます:https://stackoverflow.com/a/44948780/1652031 – TiMESPLiNTER

+0

@TiMESPLiNTERありがとうございました。私たちは最終的にテストをリファクタリングして、コンテナを変更する必要がなくなりました。 –

答えて

2

私もこの問題に直面しています。この廃止予定の取り扱い方法については、Containerクラス内にヒントはありません。

//すべての興味がありますが、current issueがgithubに公開されていますが、単体テスト用のブートストラップコードがたくさんあります。 すべてのコントローラを固定/定義された依存性を持ち、直接的なDICの使用法がないサービスとして定義することをお勧めします。

+1

彼らは彼らが[これはPR](https://github.com/symfony/symfony/pull/24418)で少し遠すぎると認めていますので、これに頼るのはちょっと安全だと思います。 –

関連する問題