我有以下课程:
class Foo
{
public function importBars(array $array)
{
foreach ($array as $key => $value) {
$this->importBar($key, $value);
}
}
public function importBar($key, $value)
{
// do stuff
}
}
我需要测试importBar
被称为count($array)
次,和是否使用正确的参数调用它。使用$this->at()
不是一种选择,因为$array
元素的顺序可能会发生变化。我有:
public function testImportBars(array $array)
{
// Mock invocation ...
$logicalOrs = array();
foreach ($array as $sku => $value) {
$logicalOrs[] = $this->logicalOr($this->equalTo($key), $this->equalTo($value));
}
$mock->expects($this->exactly(count($array)))
->method('importBar')
->with(call_user_func_array(array($this, 'logicalOr'), $logicalOrs));
}
通过测试。但是,当我故意让它失败时:
foreach ($array as $sku => $value) {
$logicalOrs[] = $this->logicalOr($this->equalTo($key), $this->equalTo(null));
}
......它仍然过去了。仅在$key
不正确时才会失败:
foreach ($array as $sku => $value) {
$logicalOrs[] = $this->logicalOr($this->equalTo(null), $this->equalTo(null));
}
...这表明PHPUnit只检查传递给Foo::importBar()
的第一个参数是否正确。
当有多个方法时,有没有办法告诉PHPUnit验证方法的参数?
答案 0 :(得分:0)
经过一些反复试验,这是我提出的最接近的解决方案:
$rows = array();
foreach ($array as $key => $value) {
$rows[] = array($key, $value);
}
$method = $mock->expects($this->exactly(count($array)))
->method('importBar');
call_user_func_array(array($method, 'withConsecutive'), $rows);
请参阅:http://phpunit.de/manual/4.1/en/test-doubles.html#test-doubles.mock-objects