2013-02-25 152 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