Как проверить, что с PHPUnit вызывались только конкретные методы макета? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть класс, который я хочу смоделировать и убедиться, что был вызван только один из его методов.Как я могу создать такой фиктивный объект в PHPUnit?Что-то вроде

public function testSystemUnderTestOnlyInvokesFoo() {
    $myMock = $this->createMock(ClassWithManyMethods::class);
    $myMock->expects($this->once())->method('foo');

    // Something like this
    // $myMock->expects($this->never)->method($this->anyMethodExcept('foo'))

    function_under_test($myMock);
}

1 Ответ

0 голосов
/ 08 октября 2018

Функция method принимает как строку, так и класс Constraint.Тест PHPUnit может создавать классы ограничений с такими служебными функциями, как isNull, contains или matches.В этом примере anyMethodExcept преобразуется в код, подобный следующему:

public function testSystemUnderTestOnlyInvokesFoo() {
    $myMock = $this->createMock(ClassWithManyMethods::class);
    $myMock->expects($this->never)
       ->method($this->logicalNot($this->matches('foo')));
    $myMock->expects($this->once())->method('foo');

    function_under_test($myMock);
}

Если у вас есть несколько методов, которые вы хотите исключить, используйте matchesRegex, например:

$myMock->expects($this->never)
   ->method($this->logicalNot($this->matchesRegex('/foo|bar|baz/')));
...