Когда я тестирую мой php-код с помощью PHPUnit, я пытаюсь найти правильный способ смоделировать объект без какого-либо из его методов.
Проблема в том, что если я не наденуне вызывайте getMockBuilder()->setMethods()
, тогда все методы объекта будут проверены, и я не могу вызвать метод, который хочу протестировать;но если я делаю , вызываю setMethods()
, то мне нужно сообщить ему, какой метод имитировать, но я вообще не хочу издеваться над какими-либо методами.Но мне нужно создать макет, чтобы избежать вызова конструктора в моем тесте.
Вот тривиальный пример метода, который я хочу протестировать:
class Foobar
{
public function __construct()
{
// stuff happens here ...
}
public function myMethod($s)
{
// I want to test this
return (strlen($s) > 3);
}
}
Я мог бы проверитьmyMethod()
with:
$obj = new Foobar();
$this->assertTrue($obj->myMethod('abcd'));
Но это вызвало бы конструктор Foobar, который я не хочу.Поэтому вместо этого я бы попробовал:
$obj = $this->getMockBuilder('Foobar')->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
Но вызов getMockBuilder()
без использования setMethods()
приведет к тому, что все его методы будут смоделированы и вернут ноль, поэтому мой вызов myMethod()
вернет ноль безкасаясь кода, который я собираюсь проверить.
Мой обходной путь до сих пор был таким:
$obj = $this->getMockBuilder('Foobar')->setMethods(array('none'))
->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
Это будет издеваться над методом с именем 'none', который не существует, но PHPUnit не делаетвсе равно.Он оставит myMethod () без изменений, чтобы я мог его вызвать, и также позволит отключить конструктор, чтобы я не вызывал его.Отлично!За исключением того, что кажется обманом необходимость указывать имя метода, который не существует - «none», или «blargh», или «xyzzy».
Что было бы правильным способом сделать это