2016-09-14 11 views
3

PHPUnitは非常に便利な機能を持っています。@dataProviderは、メソッドの複数のケースをテストできます。また、アプリケーションが確定した場所に正しいExceptionをスローするように、別のクールな注釈 - @expectedExceptionがあります。PHPUnitでデータプロバイダを使用して例外をテストするには?

私は現在、複数のエッジケースに対するメソッドをテストすることだし、このようなこれらの2つの機能(動作していないコード)を組み合わせたいと思います:

class TestMyClass 
{ 
    /** 
    * @dataProvider provideDataForFoo 
    */ 
    public function testFoo($paramBar, $paramBuz, $expected) 
    { 
     $myObject = new MyClass(); 
     $this->assertEquals($expected, $myObject->foo($paramBar, $paramBuz)); 
    } 
    public function provideDataForFoo() 
    { 
     return [ 
      ['expected lorem', 'bar lorem', 'buz lorem'], 
      ['expected ipsum', 'bar ipsum', 'buz ipsum'], 
      ['expected exception', 'bar invalid argument', 'buz invalid argument'], 
     ]; 
    } 
} 

が可能ですが/の一つとして@expectedExceptionを使用する方法場合、@dataProviderを使用して?

+2

例外をスローするセットが1つだけの場合は、そのセットに対して別のテストを追加する必要があります。そのテストでは、 'assertEquals()'が実際に例外をスローするコードを呼び出す必要があります。 – jeroen

答えて

3

PHPUnitではこの組み合わせを提供していません。

  1. 塩基性溶液ノーマルと例外テストのため

別々の試験方法:しかし、これは簡単なトリックで実現することができます。

class TestMyClass 
{ 
    /** 
    * @dataProvider provideDataForFoo 
    */ 
    public function testFoo($paramBar, $paramBuz, $expected) 
    { 
     $myObject = new MyClass(); 
     $this->assertEquals($expected, $myObject->foo($paramBar, $paramBuz)); 
    } 
    public function provideDataForFoo() 
    { 
     return [ 
      ['expected lorem', 'bar lorem', 'buz lorem'], 
      ['expected ipsum', 'bar ipsum', 'buz ipsum'], 
     ]; 
    } 
    /** 
    * @dataProvider provideDataForFooException 
    */ 
    public function testFooException($paramBar, $paramBuz, $expectedException) 
    { 
     $myObject = new MyClass(); 
     $this->expectException($expectedException); 
     $myObject->foo($paramBar, $paramBuz); 
    } 
    public function provideDataForFooException() 
    { 
     return [ 
      ['expected exception', 'bar invalid argument', '\My\Exception\Fully\Qualified\Name'], 
     ]; 
    } 
} 
  • 拡張溶液
  • 。 1つのテスト方法とReflection APIの使用。

    テスト方法は1つだけです。データプロバイダーメソッドは配列を返します。$expectedテストメソッド入力の要素にはExceptionsを指定できます。 $expectedExceptionの場合、このケースはexpectException(...)で処理します。そうでない場合は、「通常の」テストケースです。

    b。 1つのテスト方法と "例外"フラグの使用。

    理論的には、方法はreturnExceptionである。この場合、 "testItForException"のようなフラグを導入し、この情報をテストメソッドに渡す必要があります。それはさらに別の要素であってもよい。 exception、データプロバイダメソッドによって返された配列(および次にテストメソッド:if(! (empty($exception)) { test it as normal } else {expect exception}))の配列に格納されます。代わりに、あなたはまた、引数を持つ$this->setExpectedExceptionRegExp()を使用することができ、注釈の

    2

    $exceptionName — mixed (class name or exception instance) 
    $exceptionMessageRegExp — string (optional regular expression) 
    $exceptionCode — integer (optional exception code) 
    

    注:は古いsetExpectedException()方法は、PHPUnitのこれは、5.2

    に廃止されました、あなたは例外クラスを渡すことができます名前はデータプロバイダ経由で入力します。それが空でない場合は、注釈を超える方法のもう一つの利点は、あなたがテストの最初にメソッドを呼び出していない場合は、例外が期待されているについてより具体的にできることであるsetExpectedExceptionRegExp()

    を呼び出します。

    関連する問題