2017-04-24 13 views
4

マップ関数と同様に、あらかじめ計算されたテストケースの配列をmockに送信して連続呼び出しで返そうとしています。ただし、配列の引数ではなく引数のリストが必要です。PHPUnitにテストケースの配列を送信するwillReturnOnConsecutiveCalls

私の配列は、すでにfixture-generatorによって生成されており、可変長である可能性があります。

私がしたいことは、このようなものですが、もちろん、最初の呼び出しで配列全体が返されます。

// In a test case: 
$processorMock 
    ->method('process') 
    ->willReturnOnConsecutiveCalls(
     $fixtureLoader->getProcessorScenarios() // how to explode this? 
    ); 

// class FixtureLoader pseudocode: 
function getProcessorScenarios(){ 
    return [ 
     [ $param1, $param2, $param3 ], // case 1 
     [ $param1, $param2, $param3 ], // case 2 
     ... 
     [ $param1, $param2, $param3 ], // case N 
    ]; 
} 

は、私は他の言語で「...」のように構築リスト()または言語を爆発いくつかのVAR-引数を使用して、フィクスチャ・ローダから返された配列をdestructureしたいのですが、働いていたネイティブ何かを見つけることができませんでした。

私はハッキーのような感じがします。最初の回答として投稿しますQ &スタイル。私はそれが最良の方法であるかどうかを知りたい。

答えて

0

友人がPHP 5.6で利用可能な代替案を提案しましたJavascript ES6の"spread" operator。私がテストしていませんが(私のアプリは現在、環境の制約によって、PHP 5.4にロックされているとして)

これは、それゆえ、単にので、動作するはずです:

$processorMock 
    ->method('process') 
    ->willReturnOnConsecutiveCalls(
     ...$fixtureLoader->getProcessorScenarios() 
); 

これは間違いなく私が探していた甘い代替手段ですために。

0

私が見つけたアプローチは、call_user_func_array関数を使って配列をパラメータに展開しています。

call_user_func_array(
     [$processorMock->method('process'), 'willReturnOnConsecutiveCalls'], 
     $fixtureLoader->getProcessorScenarios()); 

これは気分が悪く、モックの流暢な定義を分割します。私はそれが将来の脆さのような短所を持つだろうと推測しています。

コピーパスタのテンプレートソリューションになる前に、より甘い選択肢を探したいのですが!

アップデート:私は、以来、彼らは、より複雑なタイプですと、私は、例えば、アサートのパラメータの一部をラップする必要があることがわかりました

クラス。それはPHPで正式名称を持っていないようですが、「スプラット」演算子または省略記号(...)が、同様に構造化代入の形である -

// class FixtureLoader pseudocode: 
function getProcessorScenarios(){ 
    $param1 = PHPUnit_Framework_Assert::IsInstanceOf('MyApp\Model\Thingumy'); 
    $param1 = PHPUnit_Framework_Assert::isInstanceOf('MyApp\Model\Whatsit'); 
    return [ 
     [ $param1, $param2c1, $param3 ], // case 1 
     [ $param1, $param2c2, $param3 ], // case 2 
     ... 
     [ $param1, $param2c3, $param3 ], // case N 
    ]; 
} 
関連する問題