2017-05-31 13 views
0

可能性がありますか、またはメソッドを擬似したクラスの引数をテストすることをお勧めしますか? 例:テストされたメソッドのテスト引数

class CarType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->addEventSubscriber(new User('argument example') 

    } 
} 

これは私のテストで:

public function testFormBuilder() 
    { 

    $builder = $this->getMockBuilder('Symfony\Component\Form\FormBuilder') 
     ->disableOriginalConstructor() 
     ->getMock(); 

     // Test  
     $type = new CarType(); 

      $this->builder->expects($this->once()) 
       ->method('addEventSubscriber') 
       ->with(
        $this->isInstanceOf(User::class) 
       ); 

      $type->buildForm($this->builder, []); 


    } 

このテスト作業罰金、しかし...私はUserクラスの最初の引数が文字列であるかどうかを知りたい ことができますが、私はこの同じテストでやっている?

+1

'User'の引数は、ハコードされた値か' $ options'にあるものですか?もしそれが文字列であるかどうかを本当に確認する必要があるのであれば、 'User'コンストラクタでパラメータの検証を行う必要があります。phpunitでテストできます。 – olibiaz

答えて

0

Userがテスト中のコードに直接作成されているため、直接確認することはできません。あなたがUserインスタンスのコールバックチェック詳細を使用することができます

$this->builder->expects($this->once()) 
      ->method('addEventSubscriber') 
      ->with(
       $this->callback(function($user) { 
        if (! $user instanceof User) { 
         return False; 
        } 

        if ($user->getName() != <Expected String>) { 
         return False; 
        } 

        return True; 
       }) 
      ); 

:文字列は、あなたがこのような何かを行うことができ、Userクラスのpublicメソッドを介して取得することができる場合は依存

。文字列がコンストラクタに渡されたことを確認していませんが、オブジェクトが正しく作成されていることを確認できます。

これはこれについての最良の方法ではありませんが、 Userクラスを変更することができないため、コードは拡張できません。渡されるメソッドにUserオブジェクトを渡す方が良いでしょう。これにより、今後異なる種類のUserオブジェクトを使用できます。

関連する問題