2016-04-14 18 views
0

私たちのエラー記録機能がさまざまなシナリオでどのように動作するかをテストする必要があります。そのようなシナリオの1つに解析エラーがあります。ここでは例を示します。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の例外ハンドラを無効にするかorverrideする、私たち自身をテストすることができますか?

+0

がPHP7機能のは、次のとおりです。

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

は、すでに@DevDonkeyによって提案@expectedException注釈ALSを使用しますeval。 PHP7を使用していますか? –

+0

はい、PHP7を使用しています。 – Ilija

答えて

2

PHP 7を使用していると仮定しています。PHP 5では、解析エラーが検出されず、常にPHPプロセスが終了します。

PHP 7では、あなたはキャッチが(他の答えが言うに反して)のtry/catch文を使用してエラーを解析することができます。しかし、PHP 7のParseErrorクラスは、Exceptionではなく、Errorクラスを拡張します(documentationも参照してください)。だから、catch (\Exception $e)は動作しませんが、これらのいずれかがすべき:

/** 
* @expectedException ParseError 
*/ 
public function testParseErrorLogsAnError() 
{ 
    eval('<?php not good'); 
} 
例外がスローされる