Пророчество - Ожидайте, что для объекта не будет вызван метод - PullRequest
1 голос
/ 05 августа 2020

прямо сейчас я использую следующий код в PHPUnit, чтобы ожидать, что никакой метод не будет вызван для имитации:

$object = $this->createMock(ClassA:class);
$object->expects($this->never())->method($this->anything());

Пока я не нашел способа достичь того же результата в Prophecy . До сих пор мне удалось проверить предположения только для определенных c методов, а не для всех методов, как в примере выше.

В настоящее время я использую следующее настраиваемое утверждение, чтобы проверить, не был ли вызван какой-либо метод . ObjectProphecy от Prophecy предоставляет метод для получения всех вызовов определенной c функции, поэтому я использую отражение, чтобы получить все методы класса, а затем каждый вызов для каждого метода. Если впоследствии массив вызовов пуст, я знаю, что ни один метод не был вызван. Теперь метод выглядит следующим образом:

public function assertNoMethodHasBeenCalled(ObjectProphecy $prophecy, string $className)
{
    $methods = get_class_methods($className);

    $calls = [];
    foreach ($methods as $method) {
        $reflectionMethod = new \ReflectionMethod($className, $method);
        $numArgs = count($reflectionMethod->getParameters());
        $calls = array_merge(
            $calls,
            $prophecy->findProphecyMethodCalls(
                $method,
                new ArgumentsWildcard(array_fill(0, $numArgs, Argument::any()))
            )
        );
    }

    $this->assertEmpty($calls);
}

Пока он работает для моего ограниченного размера выборки, но меня это не устраивает. Я чувствую, что должен быть более простой способ достичь того же результата.

1 Ответ

1 голос
/ 05 августа 2020

Насколько мне известно, достичь этого с помощью Prophecy непросто.

Prophecy работает иначе, чем mocks PHPUnit, когда дело касается ожиданий. Как только вы установите ожидание, каждый вызов вашего макета, который не является предсказанием или обещанием, не пройдет проверку. Учитывая следующее пророчество объекта:

$prophecy = $this->prophesize(ClassA::class);
$prophecy->methodA()->shouldNotBeCalled();

$objectA = $prophecy->reveal();

Оба

$objectA->methodA();

и

$objectA->methodB();

не пройдут проверку.

Итак, когда вы не создавайте никаких ожиданий, вам придется проверять звонки вручную, как вы это делали.

...