Ответ 1
В то время как rdlowrey правильно, что with()
не содержит условий для проверки отсутствия переданных аргументов, проблема не связана с PHPUnit, а с самим PHP.
Во-первых, если ваш метод не предоставляет значения по умолчанию, интерпретатор поднимет фатальную ошибку, если вы не передадите какие-либо параметры. Это ожидается и не совсем уместно для рассматриваемого вопроса, но важно, чтобы он стоял впереди.
Во-вторых, если ваш метод предоставляет значения по умолчанию, вызов метода без аргументов заставит PHP изменить вызов до того, как PHPUnit будет задействован для передачи значений по умолчанию. Вот простой тест, демонстрирующий PHP, вставляющий себя, прежде чем PHP сможет проверить параметры. Это ключ к пониманию того, что класс mock, созданный 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;
}
}
Это означает, что вы можете проверить, что ничто не было передано, или значения по умолчанию были переданы, но вы не можете быть более конкретными.
Вы можете обойти это ограничение? Вы можете удалить значения по умолчанию из аргументов при переопределении методов, чтобы вы могли создавать подкласс и издеваться над ним. Стоит ли оно того? Моя начальная реакция на кишечник заключается в том, что это огромный запах кода. Либо ваш дизайн, либо ваши тесты делают неправильную вещь (tm).
Если вы можете предоставить реальный, конкретный пример, где вам действительно нужно провести такой тест, стоит потратить некоторое время на размышление о решении. До тех пор я доволен чисто академическим ответом "не делай этого".:)