2016-03-18 63 views
2

我發現PHPUnit的註釋@expectedException不想從use語句(我使用psr-0進行自動加載)讀取類名稱空間路徑。PHPUnit @expectedException不尊重namesapce導入

拿這個作爲一個例子:

<?php 

namespace Outrace\Battleship\Tests; 

use Outrace\Battleship\Collection\MastCollection; 
use Outrace\Battleship\Exception\CollectionOverflowException; 

class MastCollectionTest extends \PHPUnit_Framework_TestCase 
{ 
    /** 
    * @expectedException CollectionOverflowException 
    */ 
    public function testAcceptOnlyMasts() 
    { 

     $notMastObject = new \stdClass(); 
     $mastCollection = new MastCollection(); 
     $mastCollection->attach($notMastObject); 
    } 
} 

測試,在運行時,會導致此錯誤:

ReflectionException: Class CollectionOverflowException does not exist

要糾正這種情況,我嘗試添加autoload-dev我compose.json並再次傾銷自動載入文件:

"autoload-dev": { 
    "classmap": [ 
    "src/Outrace/Battleship/Exception/" 
    ] 
}, 

或與psr-4:

"autoload-dev": { 
    "psr-4": { 
    "Outrace\\Battleship\\Tests\\": "src/Outrace/Battleship/Tests/", 
    "Outrace\\Battleship\\Exception\\": "src/Outrace/Battleship/Exception/" 
    } 
}, 

以上都不能解決問題,錯誤會持續存在。

/** 
* @expectedException Outrace\Battleship\Exception\CollectionOverflowException 
*/ 
public function testAcceptOnlyMasts() 

這是PHPUnit的的限制還是我在這裏做一些錯誤:

但是,如果註釋引用異常類的fullu限定名測試將工作做好?

回答

2

這是phpunit如何工作的限制。

它在內部使用php的ReflectionClass,它預計異常的FQCN。它只需要你在註釋中給它的字符串。

TestCase.php在檢查異常情況$reflector = new ReflectionClass($this->expectedException);expectedException屬性從註釋或setExpectedException()的調用中填充時具有以下情況。

如果使用setExpectedException()方法,您可以使用最簡單的名字,你可能就必須採取一些諸如

<?php 
namespace Outrace\Battleship\Tests; 

use Outrace\Battleship\Collection\MastCollection; 
use Outrace\Battleship\Exception\CollectionOverflowException; 

class MastCollectionTest extends \PHPUnit_Framework_TestCase 
{ 

    public function testAcceptOnlyMasts() 
    { 
     $this->setExpectedException(CollectionOverflowException::class); 
     $notMastObject = new \stdClass(); 
     $mastCollection = new MastCollection(); 
     $mastCollection->attach($notMastObject); 
    } 
}