2010-12-18 20 views
5

私は、PHPUnitがコードの1行が原因で投げthatsの例外のユニットテストでカバーされていないことを示している疑いがある(私はキャッチ)PHPUnitのコードカバレッジ&例外

私がカバーする必要がありますユニットテストを持っていますその行

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

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

} 

なぜ私のコードカバレッジはまだそれをカバーしていないのですか?

私がテストをしたが... nullを返すエコーB4を追加した例外がスローされると...私はその行が実際にカバーされていないことが判明...

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

は、すべての実行をスキップしたPHPUnitていますか?

UPDATE:私は@expectedException間違ってカントーを使用しています感を持って...

+0

は、名前空間内のあなたの「ログイン」メソッドですか? –

+0

@Anti Veerannaはい、それは 'Application \ Models'にあります。名前空間に変化がありますか? –

答えて

4

あなたのコードサンプルは、氷山の一角、正確な問題を特定するために、その困難です。

しかし、1つの詳細は私に不審なようだ:ログインの方法は、[アプリケーション\モデルであることを考えると、次のコード

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

は、任意の例外をキャッチしません、それは\アプリケーション\モデル\例外をキャッチします - もしあなたがそのようなクラスを定義していても。

多分あなたの例外ハンドラが実行されない理由です。

+1

私が間違っていない限り、解決方法は例外クラスを '\ Exception'に変更してすべての例外タイプをキャッチすることです。 –

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と「ヌル」をチェックするテストケースの書き込み