2017-04-24 75 views
4

我試圖將一個預先計算的測試用例數組發送到一個模擬中,以便在連續調用時返回 - 類似於map函數。然而它需要一個參數列表,而不是一個數組。如何將測試用例數組發送到PHPUnit willReturnOnConsecutiveCalls

我的陣列已經由夾具發生器生成,並且長度可變。

我想要做的就是這樣,但當然這會導致它在第一次調用時返回整個數組。

// 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一些,ARGS爆炸語言構造,如「......」在其他語言,但找不到任何本地奏效。

我確實有什麼感覺像一個哈克的方法,我將作爲初始答案Q &風格。我想知道這是否是最好的方法。

回答

0

一個朋友建議在PHP 5.6提供一個選擇 - 在「圖示」運算符或省略號(...),儘管它似乎並沒有在PHP的正式名稱,而是解構象的形式在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()); 

這感覺很討厭,並打破了模擬的流利定義。我猜測它會在未來出現脆弱等不利因素。

我想在它成爲複製麪食模板解決方案之前找到更甜美的選擇!

更新:

因爲我已經找到我需要換一些斷言的參數,因爲它們是更復雜的類型,例如類。

// 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 
    ]; 
}