2013-02-25 84 views
2

我試圖在PHP中測試捕獲並處理自定義異常。PHPUnit - 投擲,捕獲和處理自定義異常

我已經擴展了一些額外的屬性和方法的基本異常類型。

其中一個我正在存根的類可以拋出一個異常,我想能夠測試我正確捕獲並處理該異常(在這種情況下意味着構建一個響應對象以便從調用中返回) 。

例如

try { 

    $objectBeingStubbed->doSomething(); 

} catch (\Exception $ex) { 

    if ($ex instanceof CustomExceptionType) { 

     $this->_errorResponse->error->message = $exception->getMessage(); 
     $this->_errorResponse->error->code = $exception->getCode(); 
     $this->_errorResponse->error->data = $exception->getData(); 

    } else { 

     throw $ex; 

    } 

} 

我試圖模擬拋出異常有:

$objectStub->expects($this->any()) 
      ->method('doSomething') 
      ->will($this->throwException(new CustomExceptionType())); 

但當例外類到達我測試它現在的實例「Mock_ErrorResponse _ ????」這不會擴展我的自定義異常。我的例外是包含在Mock_ErrorResponse的「$ exception」屬性中。

是否有處理這種無需被迫做喜歡的事,可怕的任何方式:

if ($ex instanceof PHPUnit_Framework_MockObject_Stub_Exception) { 
    $ex = $ex->exception; 
} 

if ($ex instanceof CustomExceptionType) { 
... 

我測試的類裏面?

回答

3

首先,而是:

} catch (\Exception $ex) { 
    if ($ex instanceof CustomExceptionType) { 

你應該使用try/catch結構:

// (...) 
} catch (CustomExceptionType $e) { 
    // (...) 
} catch (\Exception $e) { 
    // (...) 
} 

所以,回答你的問題,基本上可能你做某事是錯誤的。因爲當存根方法拋出一個異常時,它應該拋出你用throwException方法設置的異常。

我不知道你是如何構建你的存根(也許有什麼壞了,也許是命名空間),但請考慮下面的例子工作正常。

class Unit 
{ 
    public function foo() 
    { 
     throw new \InvalidArgumentException(); 
    } 

    public function bar() 
    { 
     try { 
      $this->foo(); 
     } catch (\InvalidArgumentException $e) { 
      return true; 
     } catch (\Exception $e) { 
      return false; 
     } 

     return false; 
    } 
} 

class UnitTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testBar() 
    { 
     $sut = $this->getMock('Unit', array('foo')); 
     $sut->expects($this->any()) 
      ->method('foo') 
      ->will($this->throwException(new \InvalidArgumentException())); 

     $this->assertTrue($sut->bar()); 
    } 
} 

當然你也可以用自己的實現替代的異常和InvalidArgumentException這仍然應該工作。如果您在確定代碼出了什麼問題時仍然存在問題,請發佈更完整的示例(例如,如何構建存根)。也許那時我可以幫助更多。

+0

感謝在不同的try/catch結構的頂端。今天早上我又試了一次,它按預期工作,無法重複我昨晚的問題。我要把它歸結爲一個愚蠢的錯誤,從日常疲勞的某個地方。再次感謝您的幫助! – Dan 2013-02-26 11:12:53