Несмотря на то, что rdlowrey прав, что with()
не предусматривает проверку на отсутствие переданных аргументов, проблема не в PHPUnit, а в самом PHP.
Во-первых, если ваш метод не предоставляет значений по умолчанию, интерпретатор выдаст фатальную ошибку, если вы не передадите никаких параметров. Это ожидается и не совсем относится к рассматриваемому вопросу, но важно заявить заранее.
Во-вторых, если ваш метод предоставляет значения по умолчанию, вызов метода без аргументов заставит PHP изменить вызов до того, как PHPUnit будет задействован, чтобы вместо него передать значения по умолчанию. Вот простой тест, который демонстрирует вставку PHP перед тем, как PHP сможет проверить параметры. Важно понимать, что создаваемый PHP-класс имеет ту же сигнатуру, что и проверяемый класс, включая значения по умолчанию.
class MockTest extends PHPUnit_Framework_TestCase {
public function test() {
$mock = $this->getMock('Foo', array('bar'));
$mock->expects($this->once())
->method('bar')
->with() // does nothing, but it doesn't matter
->will($this->returnArgument(0));
self::assertEquals('foobar', $mock->bar()); // PHP inserts 1 and 2
// assertion fails because 1 != 'foobar'
}
}
class Foo {
public function bar($x = 1, $y = 2) {
return $x + $y;
}
}
Это означает, что вы можете проверить, что либо ничего не было передано, либо были переданы значения по умолчанию, но вы не можете быть более конкретным.
Можете ли вы обойти это ограничение? Вы можете удалить значения по умолчанию из аргументов при переопределении методов, так что вы сможете создать подкласс и смоделировать его. Стоит ли оно того? Моя первоначальная внутренняя реакция заключается в том, что это огромный запах кода. Либо ваш дизайн, либо ваши тесты делают неправильно (тм).
Если вы можете предоставить конкретный пример из реальной жизни, в котором вам действительно нужно провести такой тест, стоит потратить некоторое время на обдумывание решения. До тех пор я доволен чисто академическим ответом «не делай этого». :)