2011-04-09 15 views
6

モックオブジェクトを使用するときに気付いていますが、PHPUnitは実行されたテストの数を正しく報告しますが、作成しているアサーションの数を誤って報告します。実際には、私はそれを別の主張としてカウントします。 6つのテスト、7つのアサート・ステートメント、および各テスト・モックのテスト・ファイルは、6つのテスト、13のアサーションを報告しました。模倣があなたのアサーション数に影響しますか?

ここでは、1つのテストを除くすべてのテストが削除されています(ここでは例として)。また、この問題を突き止めるためにスタブを付けない別のテストを紹介しました。 PHPUnitは2つのテスト、3つのアサーションを報告します。私はダミーを削除します:1テスト、2アサーション。

require_once '..\src\AntProxy.php'; 

class AntProxyTest extends PHPUnit_Framework_TestCase { 
    const sample_client_id = '495d179b94879240799f69e9fc868234';  
    const timezone = 'Australia/Sydney'; 
    const stubbed_ant = "stubbed ant"; 
    const date_format = "Y"; 

    public function testBlankCategoryIfNoCacheExists() { 
     $cat = ''; 
     $cache_filename = $cat.'.xml'; 
     if (file_exists($cache_filename)) 
      unlink($cache_filename); 

     $stub = $this->stub_Freshant($cat); 

     $expected_output = self::stubbed_ant; 
     $actual_output = $stub->getant(); 
     $this->assertEquals($expected_output, $actual_output); 
    } 

    public function testDummyWithoutStubbing() { 
     $nostub = new AntProxy(self::sample_client_id, '', self::timezone, self::date_format); 
     $this->assertTrue(true); 
    }  

    private function stub_FreshAnt($cat) { 
     $stub = $this->getMockBuilder('AntProxy') 
        ->setMethods(array('getFreshAnt')) 
        ->setConstructorArgs(array(self::sample_client_id, $cat, self::timezone, self::date_format)) 
        ->getMock(); 

     $stub->expects($this->any()) 
      ->method('getFreshAnt') 
      ->will($this->returnValue(self::stubbed_ant)); 

     return $stub; 
    } 
} 

フレームワークの模擬方法の1つにアサーションが残っているようです。すべての(合格)アサーションが行われていることを示す方法はありますか?

答えて

8

各テストメソッドが完了すると、PHPUnitはテスト中に模擬期待設定を検証します。 PHPUnit_Framework_TestCase::verifyMockObjects()は、作成されたモックオブジェクトごとにアサーションの数をインクリメントします。実際のアサーション数を格納し、親メソッドを呼び出し、その差を減算することで、このメソッドをオーバーライドして元に戻すことができます。任意の期待が不満である場合は、例外をキャッチし、カウントをリセットした後、それを再スローする必要がありますので、もちろん

protected function verifyMockObjects() 
{ 
    $count = $this->getNumAssertions(); 
    parent::verifyMockObjects(); 
    $this->addToAssertionCount($count - $this->getNumAssertions()); 
} 

verifyMockObjects()は、アサーションの失敗の例外がスローされます。私はあなたにそれを残すでしょう。 :)

+0

私が見ている動作は故意です。アサーションカウンタをインクリメントするverifyMockObjects()には、それを上書きしないようにする理由が必要です。私はそれと一緒に暮らすだろうし、回避策でテストコードさえも捨てるつもりはない。たぶん、なぜ私はそれがこのようなものなのか理解していますが、私はそれがどこにも言及されていないことに驚いています。 – jontyc

+1

テストの一環としてモックを使用しているときは意味があります:「Xを呼び出すとモックでYが呼び出されますが、そうでなければテストは壊れています。しかし、テストを容易にするためにスタブとしてモックを使用している場合、それはちょうどノイズです。「Xを呼び出すにはYを呼び出す必要がありますが、単にfalseが必要です。結局のところ、私はアサーションの数を何にも使わないので、それは問題ではありません。 –

関連する問題