2010-08-12 92 views
3

我正在用phpUnit編寫一些單元測試來測試一個Zend Framework應用程序,並且我在changePassword函數中測試了一個異常時遇到了一些問題。測試不會失敗,但是在生成html的覆蓋工具中,「拋出新的異常($ tr-> translate('userOldPasswordIncorrect'));」線沒有經過測試。未使用phpUnit進行測試的異常?

public function changePassword(array $data, $id) 
{ 
    $user = $this->_em->find('Entities\User', (int) $id); 

    $oldPassword = sha1(self::$_salt . $data['oldPassword']); 
    if ($user->getPassword() !== $oldPassword) { 
     $tr = PC_Translate_MySQL::getInstance(); 
     throw new Exception($tr->translate('userOldPasswordIncorrect')); 
    } 

    $user->setPassword(sha1(self::$_salt . $data['password'])); 

    $this->_em->persist($user); 
    $this->_em->flush(); 
} 

這應該測試異常的單元測試:

/** 
* @depends testFindByAuth 
* @expectedException Exception 
*/ 
public function testChangePasswordWrongOldPassword() 
{ 
    $this->_dummyUser = $this->_user->findByAuth($this->_dummyEmail, $this->_dummyPassword, $this->_reseller); 

    // Try to change the password with a wrong oldPassword 
    $data['oldPassword'] = 'wrongOldPassword'; 
    $data['password'] = $this->_dummyNewPassword; 

    $this->_user->changePassword($data, $this->_dummyUser->getId()); 
} 

我希望有人能告訴我什麼,我做錯了。

更新

問題是PC_Translate_MySQL :: getInstance()方法內。有人拋出異常。正如我正在測試的那樣,通過了一個普遍的例外。解決方案不要在changePassword方法中使用常規異常。

+0

是testFindByAuth傳遞?如果沒有,取決於不會讓testChangePasswordWrongOldPassword運行。 – 2010-08-12 17:40:26

+0

testFindByAuth正在通過。 – tom 2010-08-12 17:44:22

回答

4

我的猜測是?有一個例外是從PC_Translate_MySQL::getInstance() ...

這是使用單個Exception的麻煩。這使得檢查拋出什麼異常變得更加困難。我建議改變changePassword方法拋出一個不同的異常。也許是InvalidArgumentExceptionRuntimeException。然後測試那個。

就我個人而言,我總是因爲這個原因而使用自定義異常。

try { 
} catch (DatabaseQueryException $e) { 
    // Handle database error 
} catch (DatabaseConnectionException $e) { 
    // We never even connected... 
} catch (InvalidArgumentException $e) { 
    //... 
} 

因爲這個原因,我一般不會使用catch (Exception $e)。你永遠不知道你發現了什麼異常。 (我有一個自定義的異常處理程序定義,所以我不致命,如果應用程序不捕獲,而是顯示500錯誤並記錄異常)...

+0

這就是它。但是,那麼代碼覆蓋率報告將顯示哪個異常實際上受到了打擊...... – 2010-08-12 18:06:12

+0

它會呢?當然,它會增加拋出異常,但如果像我一樣,你有一堆測試,你會發現240次訪問異常而不是239次? AFAIK,覆蓋率報告(HTML或XML)沒有顯示拋出的實際異常,只覆蓋了哪些行(因此爲什麼OP知道要問這個問題)...... – ircmaxell 2010-08-12 18:09:30

+0

確實有一個例外。當單元測試沒有$ _SERVER ['SERVER_NAME'];謝謝! – tom 2010-08-12 19:57:50