2016-04-14 123 views
0

我需要測試我們的錯誤記錄器在各種情況下的工作方式。其中一種情況是解析錯誤。這裏有一個例子:使用phpunit測試PHP解析錯誤

public function testParseErrorLogsAnError() 
{ 
    $this->assertCount(0, $this->log_handler->getRecords()); 

    try { 
     eval('<?php not good'); 
     $this->fail('Code above should throw a parse error'); 
    } catch (\Exception $e) { 
     $this->assertInstanceOf(\ParseError::class, $e); 
    } 

    $this->assertCount(1, $this->log_handler->getRecords()); 
} 

問題是,PHPUnit的總是有例外存在,並且永遠不會進入catch塊。如何禁用或限制phpunit的異常處理程序,所以我們可以測試我們自己的?

+0

拋出異常是一個PHP7功能EVAL。你在使用PHP7嗎? –

+0

是的,我們使用PHP7。 – Ilija

回答

2

對於這個答案,我假設你正在使用PHP 7.在PHP 5中,解析錯誤不能被捕獲,並且總是會終止你的PHP進程。

在PHP 7,你可以解析使用的try/catch語句錯誤(違背對方的回答說什麼)。但是,PHP 7的ParseError類擴展了Error類,而不是Exception(另請參閱documentation)。所以catch (\Exception $e)將無法​​正常工作,但任何這些應:

catch (\ParseError $e) { ... 
catch (\Error $e) { ... 
catch (\Throwable $e) { ... 

或者使用已經被@DevDonkey建議@expectedException註釋ALS:

/** 
* @expectedException ParseError 
*/ 
public function testParseErrorLogsAnError() 
{ 
    eval('<?php not good'); 
}