2016-06-30 5 views
1

私は無効な値の配列をループするPHPUnitテストを行い、それぞれが関数によって正しく拒否されることを宣言します。ループ内でどのアサーションが失敗したかを調べる方法は?

たとえば、入力が文字列の場合のみvalidateInputはtrueを返し、そうでない場合はfalseを返します。それはループでありますので、すべての値に対して同じである -

public function testValidateInput() 
{ 
    $obj = new MyClass(); 
    $data = [ 
    null, 
    42, 
    21.21, 
    -24, 
    -12.12, 
    false, 
    array('key' => 'value'), 
    (object) 'value' 
    ]; 

    foreach ($data as $item){ 
    $this->assertSame(false, $obj->validateInput($item)); 
    } 
} 

テストは、アサーションに失敗

は、私が唯一の行番号を取得します。

1) MyClassTest::testValidateInput 
Failed asserting that true is identical to false. 

/home/jeff/MyClass/tests/MyClassTest.php:24 

どのように私は、アサーションを失敗した値を決定することができますか?

+1

を使用し、それが正しいカスタムメッセージ、として最後のパラメータを渡すことが可能ですか?すると、 '$ this-> assertSame(false、$ obj-> validateInput($ item)、 'テストに失敗しました。$ item);'というメッセージが表示され、失敗した値がスクリーンに表示されます。 –

答えて

4

data providerを使用してください。 PHPUnitはプロバイダのどのインデックスに失敗したかを伝えます。また

/** 
* @dataProvider getInputData 
*/ 
public function testValidateInput($value) 
{ 
    $obj = new MyClass(); 

    $this->assertSame(false, $obj->validateInput($value)); 
} 

public function getInputData() 
{ 
    return [ 
     [null], 
     [42], 
     [21.21], 
     [-24], 
     [-12.12], 
     [true], 
     [false], 
     [array('key' => 'value')], 
     [(object) 'value'], 
    ]; 
} 

1) Test::testValidateInput with data set #3 (21.21) 
Failed asserting that true matches expected false. 

ヒント:ブールのために主張したときに、私の記憶が正しければ、assertFalse方法

+0

すばらしい、ありがとう!あなたが21.21の代わりにテストを実行すると、なぜ可能な限りの最小量が追加されるのか分かりますか? '... with data set#3(21.210000000000001) ' –

+0

[PHPマニュアルon float type](https://secure.php.net/manual/en/language.types.float.php)の警告ボックスを参照してください。リンクされたページ[なぜ私の数字が足りないのですか](http://floating-point-gui.de/)。基本的に、バイナリ表現ではfloatを正確に表現することは不可能です。 – Finwe

+0

ニース、良いもの。だから、あなたの投稿された答えは、 '(21.21)'と言うだけで手動で編集したのですか?それとも実際にマシンに表示されますか? –

1

PHPUnitのアサーションメソッドには、説明のために使用できる最後に追加パラメータがあります。記述文字列にループ反復値を含めるだけで、どれが失敗したのかを正確に知ることができます。

0

assertSameにはメッセージを受け付けるオーバーロードがあります。あなたは、メッセージのインデックスと値に沿って渡すことができます。

foreach ($data as $index => $item) { 
    $this->assertSame(false, $obj->validateInput($item), (string)$item); // include $index too 
} 
関連する問題