2016-10-15 8 views
0

Validator phpクラスをテストしています。クラスはそのバリデータメソッドを特性として取得します。したがってフォルダにValidator.phpファイルがあり、テストフォルダにvalidatorMethods.phpとValidatorTest.phpファイルがあります。PHPUnitのいくつかの特性に対するクラスのテスト

いくつかの異なるvalidatorMethods.phpファイルを使用してValidatorクラスをテストして、バリデータメソッドのさまざまな特性がロードされるようにするか、バリデータメソッドのいくつかの特性をいくつか提供してこれらのメソッドに対してValidatorクラスをテストします。

私は配列に形質を入れてから、ループ内のValidatorクラスに形質を注入するようなsthについて考えました。しかし、それはオブジェクトに形質を注入するのではなくむしろ...

どのようにして様々な形質に対してクラスをテストするのですか?おそらく、それぞれが異なる特性を使用するオブジェクトを使用する方が良いでしょうか?

答えて

0

あなたが正しく理解していれば、異なる特性を動的に実装したいと考えるValidatorクラスがあります。これは、形質がデザインされたものではありません。

特性は、同じクラスを拡張することなく、異なるクラス間で共通の機能を共有するためのものです。むしろあなたがしたいことは、それぞれの特性をインターフェースを実装するスタンドアローンのクラスにすることです。それであなたはValidatorクラスに渡すことができます。

これは次のようになります。この場合

interface ValidatorMethod { 
    public function validate($input); 
} 

class NumberValidator implements ValidatorMethod { 
    public function validate($input) { 
     return is_numeric($input); 
    } 
} 

class IntegerValidator implements ValidatorMethod { 
    public function validate($input) { 
     return is_integer($input); 
    } 
} 

class Validator { 
    private $validators = []; 

    public function addValidator (ValidatorMethod $method) { 
     $validators[] = $method; 
    } 

    public function validate($input) { 
     foreach ($validators as $validator) { 
      if (!$validator->validate($input)) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

は、あなたは彼らが正しく渡すことを確認するためにValidatorMethodオブジェクトのそれぞれについて、個々のテストを記述します。 Validatorクラスについては、必要に応じて合格し、失敗する模擬ValidatorMethodでテストを書くことになります。たとえば、以前のものの合格/不合格に関係なく、すべてのバリデーターを実行させたい場合。

テストがそうのようになります。

class ExampleValidatorMethodTest { 
    public function testValidatePass() { 
     $method = new NumberValidator(); 
     $this->assertTrue($method->validate(1)); 
    } 
} 

class ValidatorTest { 
    public function testSingleMethod() { 
     $method = $this->getMockBuilder('ValidatorMethod') 
      ->getMock(); 

     $input = 'foo'; 

     $method->expects($this->once()) 
      ->with($input); 
      ->will($this->returnValue(True)); 

     $validator = new Validator(); 
     $validator->addValidator($method); 

     $this->assertTrue($validator->validate($input)); 
    } 

    public function testMultipleMethods() { 
     $method1 = $this->getMockBuilder('ValidatorMethod') 
      ->getMock(); 

     $method2 = $this->getMockBuilder('ValidatorMethod') 
      ->getMock(); 

     $input = 'foo'; 

     $method1->expects($this->once()) 
      ->with($input); 
      ->will($this->returnValue(True)); 

     $method2->expects($this->once()) 
      ->with($input); 
      ->will($this->returnValue(True)); 

     $validator = new Validator(); 
     $validator->addValidator($method1); 
     $validator->addValidator($method2); 

     $this->assertTrue($validator->validate($input)); 
    } 
} 

あり、コードを簡単にするためのテストで行うことができますいくつかの最適化がありますが、例はちょうどあなたが探しているものの考え方にを与えることです行う。

関連する問題