2012-10-23 8 views
7

依存性注入を使用してconfig.ymlのパラメータを使用して構築されたSymfony2サービスがあります。私は今、それをユニットテストしようとしているし、ユニットテストがコンテナへのアクセス、したがってサービスへのアクセスを持っていないことがわかります。だから私はモックデータを使って自分自身を構築すべきです。 configパラメータ(config_test.yml、config.ymlなど)を読むことができればそれは意味がありますが、それは不可能です。これは、設定ファイルの代わりにテストに初期化パラメータをコーディングする必要があるため、単体テストのサービスを扱いにくくするように見えます。symfony2ユニットテストで設定パラメータを取得する

単体テスト中にconfig.ymlからのパラメータを使ってサービスを構築する方法が本当にない場合は、なぜBad Thing™なのかを誰かが知っていますか?

答えて

5

自分でテストで設定パラメータが必要だったので、この投稿が見つかりました。これがGoogleの最初のヒットです。

しかし、これは機能する解決策です。より良いものがあるかもしれません。

<?php 

... 

require_once(__DIR__ . "/../../../../../app/AppKernel.php"); 

class MediaImageTest extends WebTestCase 
{ 
    private $_application; 
    private $storagePath; 

    public function setUp() { 
     $kernel = new \AppKernel('test', true); 
     $kernel->boot(); 
     $this->_application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel); 
     $this->_application->setAutoExit(false) 

     $this->storagePath = $this->_application->getKernel()->getContainer()->getParameter('media_path'); 
    } 

    ... 
} 

あなたもこのに見えるかもしれません:Access Symfony 2 container via Unit test? は、ユニットテストの中にカーネルにアクセスするよりクリーンなソリューションです。

+3

$ container-> getParameter()は –

2

ユニットテストとは、クラスを他のクラスとは別にテストすることです。サービスを単体テストするには、設定から何かを読む必要はありません。あなたのテストで価値を渡すだけです。結局のところ、それは他の値と一緒に使える可能性がありますね。

もちろん、受け入れられた値の周りにロジック/検証がある場合は、テストでそれをカバーするべきでしょう。あなたが設定からこの価値を取っていたなら、あなたはそれをどうやってやるか考えてみてください。異なる値で動作をテストすることはできません。

アプリケーションが正常に動作しているかどうか(クラスが期待どおりに連携しているかどうか)を確認するには、機能テストまたは受け入れテストツール(Behatなど)を使用します。

+0

私のサービスは、(私たちが生産し、テストモードでのサーバーを持っている)我々のテストサーバーからのデータにプルする必要があります。私がここでテストしているのは、そこから得られるデータにサービスがどのように反応するかです。それは完全に分離された単体テストではありませんが、私はすでにサーバーから出力されるデータが正しいことを確認しています。サーバーの出力をコピーして保存して手動でサービスにフィードするのではなく、データそのもの。 – Craig

+1

これは単体テストではありません。統合テストまたはシステムテストの強化symfonyの機能テスト(これはPHPUnitテストです)を使用するのが最も簡単です。機能テストクライアントには、コンテナへのアクセス権があります(http://symfony.com/doc/2.0/book/testing.html#accessing-internal-objects)。それでもユニットテストクラスを使用したい場合は、ここでユニットテストのコンテナを初期化してみてください:https://gist.github.com/1319290 –

+0

ファイルをダウンロードするクラスで "unit"テストを行うにはどうしたらいいですか? ?それはそれ自身の外に達するので、常に機能テストと見なされますか? – Craig

8

これは私の作品:

class MyServiceTest extends WebTestCase 
{ 
    public function testCookies() 
    { 
     $client = static::createClient(); 

     $myParams = $client->getKernel()->getContainer()->getParameter('my_params'); 
    } 
} 
+1

と答えていますが、ユニットテストのためにWebTestCaseを拡張することに問題があるかどうかは疑問ですが(通常は機能テストに使用されています) – timhc22

0

私はsymfony 3.2.2を使用していますが、私はこれがあなたのためにも働くことができると思います。

それは単にラインです:

$export_dir = static::$kernel->getContainer()->getParameter('export_dir'); 
関連する問題