Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. MockMethodCallRule.php

function MockMethodCallRule::processNode

File

vendor/phpstan/phpstan-phpunit/src/Rules/PHPUnit/MockMethodCallRule.php, line 30

Class

MockMethodCallRule
@implements Rule<MethodCall>

Namespace

PHPStan\Rules\PHPUnit

Code

public function processNode(Node $node, Scope $scope) : array {
    if (!$node->name instanceof Node\Identifier || $node->name->name !== 'method') {
        return [];
    }
    if (count($node->getArgs()) < 1) {
        return [];
    }
    $argType = $scope->getType($node->getArgs()[0]->value);
    if (count($argType->getConstantStrings()) === 0) {
        return [];
    }
    $errors = [];
    foreach ($argType->getConstantStrings() as $constantString) {
        $method = $constantString->getValue();
        $type = $scope->getType($node->var);
        if ((in_array(MockObject::class, $type->getObjectClassNames(), true) || in_array(Stub::class, $type->getObjectClassNames(), true)) && !$type->hasMethod($method)
            ->yes()) {
            $mockClasses = array_filter($type->getObjectClassNames(), static function (string $class) : bool {
                return $class !== MockObject::class && $class !== Stub::class;
            });
            if (count($mockClasses) === 0) {
                continue;
            }
            $errors[] = RuleErrorBuilder::message(sprintf('Trying to mock an undefined method %s() on class %s.', $method, implode('&', $mockClasses)))->identifier('phpunit.mockMethod')
                ->build();
            continue;
        }
        $mockedClassObject = $type->getTemplateType(InvocationMocker::class, 'TMockedClass');
        if ($mockedClassObject->hasMethod($method)
            ->yes()) {
            continue;
        }
        $classNames = $mockedClassObject->getObjectClassNames();
        if (count($classNames) === 0) {
            continue;
        }
        $errors[] = RuleErrorBuilder::message(sprintf('Trying to mock an undefined method %s() on class %s.', $method, implode('|', $classNames)))->identifier('phpunit.mockMethod')
            ->build();
    }
    return $errors;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal