2016-09-14 46 views
3

PHPUnit有一個非常有用的功能@dataProvider,它允許測試多個方法的情況。它還有另一個很酷的註釋 - @expectedException以確保應用程序在指定位置拋出正確的Exception如何在PHPUnit中使用數據提供程序測試異常?

我目前正在測試針對多個邊緣的情況下的方法,並希望這兩個特徵是這樣的(不工作密碼)結合:

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

如果只有一組應該拋出異常,則應該爲其添加一個單獨的測試。該測試應該調用實際拋出異常的代碼,因爲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'], 
     ]; 
    } 
} 
  • 擴展溶液
  • 一個。一種測試方法並使用Reflection API。

    我們只有一種測試方法。數據提供者方法返回一個數組,其中$expected測試方法輸入的元素可以是Exceptions。如果$expectedException我們處理這個案件expectException(...),否則作爲一個「正常」的測試案例。

    b。一種測試方法並使用「異常」標誌。

    理論上可以使用returnException。爲了考慮這種情況,我們必須引入一個像「testItForException」這樣的標誌並將這些信息提供給測試方法。它也可以是另一個元素,例如exception,在由數據提供者方法返回的數組中(然後在測試方法中:if(! (empty($exception)) { test it as normal } else {expect exception}))。

    2

    相反,你也可以使用$this->setExpectedExceptionRegExp()的論據註釋的

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

    注:setExpectedException()方法已在PHPUnit的5.2

    這意味着被棄用,你可以傳遞一個異常類名稱通過數據提供者。如果不是空的,叫setExpectedExceptionRegExp()

    在註釋的方法的另一個好處是,你可以約更具體的地方異常是預期的,如果你不調用該方法在測試開始。