Создание макета в phpunit без насмешек какими-либо методами?
Когда я тестирую мой 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()
с участием:
$obj = new Foobar();
$this->assertTrue($obj->myMethod('abcd'));
Но это вызвало бы конструктор Фубара, который я не хочу. Поэтому вместо этого я бы попробовал:
$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».
Каков будет правильный способ сделать это?