2010-12-18 87 views
5

我懷疑PHPUnit的是示出了1行的代碼沒有覆蓋因爲異常的單元測試這就是甩(但我抓住)PHPUnit的代碼覆蓋率和異常

我已經單元測試應該覆蓋該行

/** 
* @expectedException Doctrine\ORM\NoResultException 
*/ 
public function testCannotLoginInvalidUser() { 

    $user = User::login($this->em, 'nonExistant', 'password'); 
    $this->assertNull($user); 

} 

爲什麼我的代碼覆蓋率仍然反映,沒有涵蓋?

我做了一個試驗...添加回聲B4返回null ......我發現,該行確實不是蓋的......

try { 
    $user = $query->getSingleResult(); 
} catch (Exception $e) { 
    echo 'caught exception'; <-- this does not get executed. 
    return null; 
} 

是PHPUnit的跳過所有執行一次拋出一個異常?

更新:我得到了我使用@expectedException錯誤壽的感覺...

+0

是您在命名空間裏「登錄」的方法? – 2010-12-19 10:01:18

+0

@Anti Veeranna,是的,它在'Application \ Models'中。它在名稱空間中是否會改變任何內容? – 2010-12-19 11:54:19

回答

4

你的代碼示例是冰山的一角,它很難確定確切的問題。

但一個細節看似可疑的對我說:因爲你的登錄方法是在應用程序\型號的話,下面的代碼

try { 
    $user = $query->getSingleResult(); 
} catch (Exception $e) { 

不會捕捉任何異常,它會趕上\應用\型號\異常 - 如果你甚至有這樣的類定義。

也許這就是你的異常處理程序不運行的原因。

+1

除非我弄錯了,否則解決方法是將異常類更改爲'\ Exception',以便捕獲所有異常類型。 – 2011-11-08 21:59:39

2

@expectedException註釋與此類似testcode:

public function testDoStuff() { 
    try { 
     doStuff(); 
    } catch(Exception $e) { 
     // Test passed 
     return; 
    } 
    $this->fail("Exception not thrown, test failed !"); 
} 

所以你不能(也不應該)測試在這一次測試用例兩件事情。 (如果拋出異常並返回值)

如果你想測試一下User::login會拋出一個異常,那麼你最好去那個測試用例並且不需要斷言(該代碼不會被執行:) )

get the red line covered您需要編寫代碼,以便$ query-> getSingleResult()引發異常。這可能會很棘手,但由於我沒有看到足夠的源代碼(例如查詢對象來自何處),因此我無法在此處詳細說明。

如果$查詢對象是一個模擬讓它扔在一個異常 - > getSingleResult寫測試用例檢查「空」