2017-07-03 21 views
1

A PHPUnit data provider allows the return of an iteratorですが、AppendIteratorを使用する場合は、最後のイテレーターのみを使用します。 PHPUnitデータプロバイダとしてAppendIteratorsを使用できないのですか?phpunitとAppendIteratorデータプロバイダ?

テストファイル:

<?php 

use PHPUnit\Framework\TestCase; 

class AppendIteratorTest extends TestCase 
{ 
    /** 
    * @dataProvider getAppendIterator 
    */ 
    public function testAppendIterator($item) { 
     echo PHP_EOL."test> $item".PHP_EOL; 
    } 

    public function getAppendIterator() { 
     $iterator = new AppendIterator(); 
     $iterator->append(new ArrayIterator([[0], [1]])); 
     $iterator->append(new ArrayIterator([[2], [3]])); 
     $iterator->append(new ArrayIterator([[4], [5]])); 

     foreach($iterator as $i) { 
      echo 'foreach> '.print_r($i, true); 
     } 

     return $iterator; 
    } 
} 

テストファイル出力:

$ vendor/bin/phpunit --debug AppendIteratorTest.php 
     foreach> Array 
    (
     [0] => 0 
    ) 
    foreach> Array 
    (
     [0] => 1 
    ) 
    foreach> Array 
    (
     [0] => 2 
    ) 
    foreach> Array 
    (
     [0] => 3 
    ) 
    foreach> Array 
    (
     [0] => 4 
    ) 
    foreach> Array 
    (
     [0] => 5 
    ) 
    PHPUnit 6.2.3 by Sebastian Bergmann and contributors. 


    Starting test 'AppendIteratorTest::testAppendIterator with data set #0 (4)'. 
    R 
    test> 4 

    Starting test 'AppendIteratorTest::testAppendIterator with data set #1 (5)'. 
    R                 2/2 (100%) 
    test> 5 


    Time: 24 ms, Memory: 4.00MB 

    There were 2 risky tests: 

    1) AppendIteratorTest::testAppendIterator with data set #0 (4) 
    This test did not perform any assertions 

    2) AppendIteratorTest::testAppendIterator with data set #1 (5) 
    This test did not perform any assertions 

    OK, but incomplete, skipped, or risky tests! 
    Tests: 2, Assertions: 0, Risky: 2. 

答えて

0

は私が間違ったことを設定するか、AppendIteratorsはPHPUnitのデータプロバイダとして使用することはできませんでしょうか?

並べ替えが間違っています。 PHPUnitのデータ・プロバイダは、任意のarrayまたはTraversableAppendIteratorTraversableである)をサポートしています。だからそれはうまくいく(あなたはエラーが出ないのでこれを見ることができる)。

しかし、データプロバイダには(あまり知られていない)詳細があります。各データセットの名前はです。 の名前は、指定された配列のキーです。Traversableの場合、値はIterator::key()です。配列キーであるArrayIteratorの場合あなたの鍵で

$iterator->append(new ArrayIterator([0 => [0], 1 => [1]])); 
    $iterator->append(new ArrayIterator([0 => [2], 1 => [3]])); 
    $iterator->append(new ArrayIterator([0 => [4], 1 => [5]])); 

をあなたが重複キーを持っているように、これらのは、常に0と1になり、最後のものは「勝利」します:

ここでキーを持つあなたのコードはPHPが暗黙のうちにそれらを作成して見えるようになります。これはあなたが見る結果です。

何が起こっているか説明するほどです。

一つの解決策は、次のようになります。

$iterator->append(new ArrayIterator([0 => [0], 1 => [1]])); 
    $iterator->append(new ArrayIterator([2 => [2], 3 => [3]])); 
    $iterator->append(new ArrayIterator([4 => [4], 5 => [5]])); 

再番号キーをだろう、また、私はIterator Garden中1(IndexingIteratorが近い、Börgers例は来ていないPHPには、デフォルトのイテレータはありませんダウンしている、Nikic iter lib's reindexはあなたのケースで迅速なインラインは次のようになります)収穫のインデックスを再作成、それを行うことができます...:ここでは

public function getAppendIterator() { 
    $iterator = new AppendIterator(); 
    $iterator->append(new ArrayIterator([[0], [1]])); 
    $iterator->append(new ArrayIterator([[2], [3]])); 
    $iterator->append(new ArrayIterator([[4], [5]])); 

    $index = 0; 
    foreach ($iterator as $i) { 
     yield $index++ => $i; 
    } 
} 

$indexカウンタがキーとして使用されていますyieldステートメントで。これにより、データプロバイダはGeneratorを返します。Traversableです。 Phpunitはそれを処理できます。

文字列キーを使用してデータセットを返す複数のデータプロバイダメソッドがある場合、この問題は同様です。すべての文字列キーは一意でなければなりません。指定されたデータは再び上書きされます。

内部的には、各データプロバイダのデータセットは明示的に配列に変換されます。

これはあなたの質問にお答えし、あなたが探しているデータプロバイダを作成するのに役立ちます。

+0

THANKS @hakre!あなたの答えを読んだので、それは完全に意味があります。 – Shawn

関連する問題