2012-12-03 54 views
1

我目前正在爲Symfony2開發比特幣支付包。您可以在my github上查看。它不是(但我希望)完全開發了測試驅動,但我儘可能地將其作爲測試覆蓋。PHPUnit代碼實現接口的抽象類的覆蓋範圍

Bundle包含實現CommandInterface接口的AbstractCommand類。因爲它是一個抽象類,所以不需要實現每個接口的方法。大。

接下來,我有AbstractCommandTest測試用例。它測試validateParameters方法運作良好。測試涵蓋班級的每一行。但是......當我在IDE上運行測試覆蓋率分析(IntelliJ Idea with PHP Plugin)時,它顯示覆蓋率達到93%。這是非常奇怪的,因爲沒有線被標記爲紅色(我已經改變了默認配色方案,所以我看得很清楚;))。

問題是:爲什麼? 它是PHPUnit的bug嗎?或者,也許這是類模型建設問題?當我在AbstractCommand內部有抽象方法(並且沒有接口)時,它們也沒有被覆蓋。

回答

0

我已經解決了這個問題,當看着三葉草覆蓋文件。它顯示:

<file name="/srv/bundles-src/payment-bitcoin/Bitcoin/Client/Command/AbstractCommand.php"> 
    <class name="AbstractCommand" namespace="Wikp\Payment\BitcoinBundle\Bitcoin\Client\Command"> 
     <metrics methods="2" coveredmethods="2" conditionals="0" coveredconditionals="0" statements="13" coveredstatements="13" elements="15" coveredelements="15"/> 
    </class> 
    <line num="0" type="stmt" count="0"/> 
     <!-- coverage data for methods --> 
    <line num="36" type="stmt" count="0"/> 
    <metrics loc="35" ncloc="35" classes="1" methods="2" coveredmethods="2" conditionals="0" coveredconditionals="0" statements="13" coveredstatements="13" elements="15" coveredelements="15"/> 
    </file> 

當你看AbstractCommand文件,第36行是類定義後一個空行。刪除它會導致覆蓋率爲100%。我認爲這是IntelliJ's/PHPStorm的問題。

2

正如我所看到的,您可能沒有涵蓋validateParameters方法中的catch聲明。

嘗試使您的ParameterBug參數作爲模擬,以便在另一個測試中拋出\InvalidArgumentException異常。這應該包括你想要的(但爲了使人們有可能,你必須改變你的validateName方法來保護):

$parameterSetMock = $this->getMock('AppropraiteNamespace\ParameterSet', array('validateName')); 
$parameterSetMock->expects($this->any()) 
    ->method('validateName') 
    ->will($this->throwException(new \InvalidArgumentException); 

一兩件事:

您沒有使用try/catch塊在你的測試中。如果你使用:

$this->setExpectedException('ExpectedException', 'Expected Message'); 

在測試開始時,如果預期的異常不會被拋出,測試將失敗。

+0

我會盡快檢查並寫出有關結果。儘管如此 - 感謝您的回覆! 我嘗試...捕捉異常,因爲我想檢查異常的參數是否有效。 setExpectedException不允許這樣的檢查(afaik)。 – wikp

+0

我檢查過並且...不,catch語句以及整個AbstractCommand類都被覆蓋了。當我用覆蓋面進行運行時,我的IDE中沒有「紅線」。 – wikp

+0

我不知道自從最近兩天以來您是否已經改變了某些東西,但我剛剛克隆了您的項目並運行了單元測試。我的報道顯示AbstractCommand被100%覆蓋.. PHP 5.4.9,PHPUnit 3.7.1,XDebug 2.2.1 – Cyprian