2010-11-25 10 views
0

最近私は単体テストの使用を開始しましたが、これまでのところ爆発的でした。治具データをテストする

しかし、私は自分のアプローチが間違っていると感じ、「良い」ソリューションの周りを頭で覆うことができない状況にぶつかってきました。

コードのコンテキストは、sfPHPUnit2Pluginでテストしたsymfonyで書かれたテレビ放送スケジュールを表示するアプリケーションです。

public function testLoadChannelBroadcasts() { 

    $Start = new DateTime(); 
    $End = new DateTime(); 

    $Channels = ChannelTable::getChannelsWithBroadcastsTouchingTimeSpan($Start, $End); 

    foreach ($Channels as $Channel) { 
     $Channel->loadBroadcastsTouchingTimeSpan($Start, $End); 
    } 

    // test data 

    $Broadcasts = $Channels[0]->Broadcasts; 

    $assertion = $Broadcasts[0]->getDateTimeObject('start') <= $Start 
    && $Broadcasts[0]->getDateTimeObject('end') >= $Start; 

    $this->assertTrue($assertion, 'starts before scope, ends inside scope'); 

    $assertion = $Broadcasts[1]->getDateTimeObject('start') >= $Start 
    && $Broadcasts[1]->getDateTimeObject('end') <= $End; 

    $this->assertTrue($assertion, 'starts inside scope, ends inside scope'); 

    $assertion = $Broadcasts[2]->getDateTimeObject('start') >= $Start 
    && $Broadcasts[2]->getDateTimeObject('end') >= $End; 

    $this->assertTrue($assertion, 'starts inside scope, ends outside scope'); 

    $LongBroadcast = $Channels[1]->Broadcasts[0]; 

    $assertion = $LongBroadcast->getDateTimeObject('start') <= $Start 
    && $LongBroadcast->getDateTimeObject('end') >= $End; 

    $this->assertTrue($assertion, 'starts before scope, ends after scope'); 
} 

試験は、本方法の目的を伝達するが、データ(フィクスチャ)のテストデータが含まれているかについての仮定に大きく依存しています。これにはより良いアプローチがありますか?あなたがChannelTableを呼び出すことにより、その境界の外の方法をテストしているので、それは、今あるよう

答えて

0

これは本当にユニットテストではありません。

これを行うための適切な方法を変更するには、次のようになります。

$Channels = ChannelTable::getChannelsWithBroadcastsTouchingTimeSpan($Start, $End); 

へ:ChannelTableは正しいデータを提供するために失敗した場合

$Channels = array('yourdata', 'etc'); 

この方法で、あなたのテストが失敗しません、それはしないでください。

ユニットテストの目的は、ユニット(メソッド)をテストすることであり、何もテストしないことです。アプリケーション全体がデータベースへの接続に失敗し、データを提供できない場合、メソッドが正常に動作するため、ユニットテストは引き続き実行されます。

関連する問題