Создание макета в 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».

Каков будет правильный способ сделать это?

Ответы на вопрос(4)

Ваш ответ на вопрос