Для кода ниже,
$mockObject->expects($this->at(0)) ->method('search') ->with($searchConfig) ->will($this->returnValue([]));
Эта строка автоматически сделает подтверждение того, что при вызове метода search
он должен содержать параметры $searchConfig
. В этом случае мы должны предоставить полностью сопоставленный $searchConfig
но иногда это сложно, если это массив или объект.
Есть ли какой-либо возможный способ дать PHPUnit вызов некоторому определенному методу, чтобы утверждать, что он содержит аргументы, передаются методом, как мы хотим?
Например, я могу создать функцию закрытия, чтобы утверждать, как показано ниже, вместо метода ->with()
function ($config){ $this->assertFalse(isset($config['shouldnothere'])); $this->assertTrue($config['object']->isValidValue()); }
Вы можете использовать ->with($this->callback())
и передать закрытие для выполнения более сложных утверждений в аргументе.
Из документов PHPUnit
Ограничение callback () может использоваться для более сложной проверки аргументов. Это ограничение принимает обратный вызов PHP как единственный аргумент. Обратный вызов PHP получит аргумент, который будет проверяться как единственный аргумент, и должен возвращать TRUE, если аргумент проходит проверку и FALSE в противном случае.
Пример 10.13: Более сложная проверка аргументов
getMock ('Observer', array ('reportError'));
$observer->expects($this->once()) ->method('reportError') ->with($this->greaterThan(0), $this->stringContains('Something'), $this->callback(function($subject){ return is_callable(array($subject, 'getName')) && $subject->getName() == 'My subject'; })); $subject = new Subject('My subject'); $subject->attach($observer); // The doSomethingBad() method should report an error to the observer // via the reportError() method $subject->doSomethingBad(); } } ?>
-$observer->expects($this->once()) ->method('reportError') ->with($this->greaterThan(0), $this->stringContains('Something'), $this->callback(function($subject){ return is_callable(array($subject, 'getName')) && $subject->getName() == 'My subject'; })); $subject = new Subject('My subject'); $subject->attach($observer); // The doSomethingBad() method should report an error to the observer // via the reportError() method $subject->doSomethingBad(); } } ?>
Таким образом, ваш тест станет следующим:
$mockObject->expects($this->at(0)) ->method('search') ->with($this->callback( function ($config){ if(!isset($config['shouldnothere']) && $config['object']->isValidValue()) { return true; } return false; }) ->will($this->returnValue([]));