2012-02-09 2 views
6

エンティティマネージャとリクエストを使って、いくつかの正規バリデータとカスタムバリデータの両方を持つモデルのテストを書こうとしています。私はこの問題が何らかの理由で問題になったら、私のテストにphpunitを使っています。symfony2ユニットバリデーションバリデーションカスタムバリデーター

私は、エンティティマネージャと要求の両方をスタブし、次にいくつかのオブジェクトを検証することによって、カスタムバリデータをテストします。これによりカスタム検証が動作することが証明されたので、通常の検証をテストするだけで済みます。可能であれば、カスタム検証ツールをそのまま残しておいてください。私のテストで

/** 
* @MyAssert\Client() 
*/ 
abstract class BaseRequestModel { 

    /** 
    * @Assert\NotBlank(message="2101") 
    */ 
    protected $clientId; 

    /** 
    * @Assert\NotBlank(message="2101") 
    */ 
    protected $apiKey; 

    // ... 

} 

が、私は、オブジェクトを作成し、それを検証し、バリデータを取得しています:

は、ここに私のモデルです。もちろん

$validator = ValidatorFactory::buildDefault()->getValidator(); 
$requestModel = new RequestModel(); 
$errors = $validator->validate($requestModel); 

それはサービスであり、いくつかの依存性注入コンテナによって解決される必要がMyAssert \クライアント用に定義されたバリデータを、見つけることができないので、これは失敗します。

誰でもカスタムバリデータをスタブする方法、またはのバリデーションから除外する方法はありますか?

+0

なぜ機能テストでテストしないのですか?カスタムバリデータクラスを既にユニットテストしているので、テストする必要があるのは実際の環境です。 'Symfony \ Bundle \ FrameworkBundle \ Test \ WebTestCase'で作成されたもののように、実際のコンテナからバリデータを取得してみませんか? – Florian

+0

まず、機能テストは遅いです。私は、テストデータベースをセットアップし、フィクスチャーをそれに取り込み、テストを実行する必要があります。これは、ウェブページの使用のように、すべての場所でテストされるだけのものには魅力的です。モデルのバリデーションをテストするために、私はデータベースなどすべてを必要としないので、単体でテストしたいと思います。 – Sgoettschkes

+0

私はそれが遅いことに同意しますが、DIC遅延読み込みでは、 'validator'サービスとその直接の依存関係(注釈リーダーのような)だけがインスタンス化されます。 '$ container-> get( 'validator') - > validate($ object);' – Florian

答えて

6

私はそのようなものでいいと思う:

class MyTest extends Symfony\Bundle\FrameworkBundle\Test\WebTestCase 
{ 
    private function getKernel() 
    { 
     $kernel = $this->createKernel(); 
     $kernel->boot(); 

     return $kernel; 
    } 

    public function testCustomValidator() 
    { 
     $kernel = $this->getKernel(); 
     $validator = $kernel->getContainer()->get('validator'); 

     $violationList = $validator->validate(new RequestModel); 

     $this->assertEquals(1, $violationList->count()); 
     // or any other like: 
     $this->assertEquals('client not valid', $violationList[0]->getMessage()); 
    } 
} 
+0

さて、私はそれを試しました。次の問題:バリデータが検証のためにipを必要とするため、サービスにスコープ要求があります。検証の定義をymlに変更し、別のymlを使用してこの特別なバリデータをスタブで上書きすることについて考えています。 – Sgoettschkes

+2

'$ container-> enterScope( 'request')を使って、手動でコンテナの範囲を変更できます。 $ container-> set( 'request'、新しいRequest、 'request'); ' – Florian

+0

これで動作します。カスタムバリデータのクラスをいくつかのスタブで上書きすることで、私は非常にうまくテストできます。ありがとう! – Sgoettschkes

3

は、あなたはこれを試してみましたか?

$validator = Validation::createValidatorBuilder()->enableAnnotationMapping()->getValidator();