2014-03-24 63 views
2

我測試使用PHPUnit的方法,我有以下情形:測試調用該方法有一些參數,等等

  • 法「的setParameter」被稱爲次
  • 方法的未知量'setParameter'被調用不同類型的參數
  • 各種參數之間的方法'setParameter'務必用一組參數調用。

我試着做這種方式:

$mandatoryParameters = array('param1', 'param2', 'param3'); 
foreach ($mandatoryParameters as $parameter) { 
    $class->expects($this->once()) 
     ->method('setParameter') 
     ->with($parameter); 
} 

不幸的是,測試方法之前被調用,這些參數它被稱爲與其它參數也因失敗。我得到的錯誤是:

Parameter 0 for invocation Namespace\Class::setParameter('random_param', 'random_value') 
does not match expected value. 
Failed asserting that two strings are equal. 

回答

1

嘗試使用$this->at()方法。每次用循環覆蓋你的模擬。

$mandatoryParameters = array('param1', 'param2', 'param3'); 
$a = 0; 
foreach ($mandatoryParameters as $parameter) { 
    $class->expects($this->at($a++); 
     ->method('setParameter') 
     ->with($parameter); 
} 

這將設置你的模擬期望setParameter被稱爲一定的次數和每次調用將與不同的參數。您需要知道哪個呼叫是您的參數的具體內容,並相應地調整該號碼。如果調用不是順序的,可以爲每個參數的索引設置一個鍵。

$mandatoryParameters = array(2 =>'param1', 5 => 'param2', 6 => 'param3'); 

foreach ($mandatoryParameters as $index => $parameter) { 
    $class->expects($this->at($index); 
     ->method('setParameter') 
     ->with($parameter); 
} 

該指數是基於零所以,要記得從0開始計數的,而不是1

http://phpunit.de/manual/current/en/phpunit-book.html#test-doubles.mock-objects.tables.matchers

+0

如果我不知道該功能會究竟有多少次被稱爲有我無法檢查它是否會在其他調用中與這些參數一起調用? – spdionis

+1

你不需要知道函數會被調用多少次,但是你確實需要知道它會在哪一點。這對每次測試都應該是一樣的,所以你需要確定這一點。雖然進行測試,但您還應該確切知道該函數將被調用的次數,因爲您應該可以控制整個測試系統,並且可以向其提供能夠爲您提供具有一致參數的已知數量的調用的數據。 – Schleis

相關問題