2017-06-16 5 views
2

にイテラブル:PHPのテストは二つの配列が同じ値が含まれていることを主張することは非常に簡単PHPUnitのPHPUnitの

$this->assertEquals([1, 2, 3], [1, 2, 3]); 

最近のバージョンでは、イテレータとジェネレータの使用量が多く、より魅力作られ、そしてPHP 7.1はthe iterable pseudo-typeを導入しました。つまり、普通の古いarrayを使用しているか、または怠惰なGeneratorを使用しているという事実に縛られることなく、iterableを受け取って返す関数を書くことができます。

iterableを返す関数の戻り値をアサートするにはどうすればよいですか?理想的に私は何かをすることができる

$this->assertIterablesEqual(['expected', 'values'], $iterable); 

このような機能はありますか?あるいは、私のテストにもう一つのポイント命令コードを積み重ねることを含まない、これをテストする純然たる方法がありますか?

答えて

1

あなたは一例として、iterator_to_array機能を使用することができます。

$expected = [1, 2, 3]; 
$this->assertEquals($expected, iterator_to_array($iterable)); 

これもgeneratorsのために働きます。

・ホープ、このヘルプ

+0

'Traversable'を持っていて、yesの値だけを気にしている場合にはうまくいきます。しかし、 'iterator_to_array'は' Traversable'だけを取るので、 'iterable'では動作しません。 –

1

は、私はあなたが最初反復処理可能をラップする必要があると思います。例として、反復処理可能はイテレータの庭で見つけることができますのためのデコレータはTraversableのとしてdecorating anything foreach-ableあるForeachIteratorの名前:

$iterator = new ForeachIterator($iterable); 
$this->assertEquals([1, 2, 3], itarator_to_array($iterator)); 

注意し細部に、それはまた、オブジェクト反復処理可能内を検討することそのテストは、正確なテストには十分厳しくはありません。

しかし、これは配列とトラバース可能オブジェクト回すだけにテスト中のプライベートヘルパーメソッドに変換するのは簡単でなければなりません - ない非トラバース可能オブジェクトを - イテレータ/配列にアサーションを適用します。

private function assertIterablesEqual(array $expected, iterable $actual, $message = '') 
{ 
    $array = is_array($actual) ?: iterator_to_array($actual); 
    $this->assertEquals($expected, $array, $message); 
} 

これはさらにextracted into an assertion class to extend Phpunit itselfです。

iterator_to_arrayは、重複するキーでエントリを置き換えるため、重複キーの最後の反復値を持つ配列になります。反復キーのアサーションも必要な場合は、トラバーサルメソッドの装飾や変更が必要になることがあります。

関連する問題