use Drupal\Core\Access\AccessResult;
use Drupal\Core\Access\CustomAccessCheck;
+use Drupal\Core\Controller\ControllerResolver;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Session\AccountInterface;
use Drupal\Tests\UnitTestCase;
use Symfony\Component\Routing\Route;
+use Drupal\Core\DependencyInjection\ClassResolverInterface;
+use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface;
/**
* @coversDefaultClass \Drupal\Core\Access\CustomAccessCheck
$this->assertEquals(AccessResult::allowed(), $this->accessChecker->access($route, $route_match, $account));
}
+ /**
+ * Tests the access method exception for invalid access callbacks.
+ */
+ public function testAccessException() {
+ // Create two mocks for the ControllerResolver constructor.
+ $httpMessageFactory = $this->getMockBuilder(HttpMessageFactoryInterface::class)->getMock();
+ $controllerResolver = $this->getMockBuilder(ClassResolverInterface::class)->getMock();
+
+ // Re-create the controllerResolver mock with proxy to original methods.
+ $this->controllerResolver = $this->getMockBuilder(ControllerResolver::class)
+ ->setConstructorArgs([$httpMessageFactory, $controllerResolver])
+ ->enableProxyingToOriginalMethods()
+ ->getMock();
+
+ // Overwrite the access checker using the newly mocked controller resolve.
+ $this->accessChecker = new CustomAccessCheck($this->controllerResolver, $this->argumentsResolverFactory);
+
+ // Add a route with a _custom_access route that doesn't exist.
+ $route = new Route('/test-route', [], ['_custom_access' => '\Drupal\Tests\Core\Access\NonExistentController::nonExistentMethod']);
+ $route_match = $this->getMock(RouteMatchInterface::class);
+ $account = $this->getMock(AccountInterface::class);
+
+ $this->setExpectedException(\BadMethodCallException::class, 'The "\Drupal\Tests\Core\Access\NonExistentController::nonExistentMethod" method is not callable as a _custom_access callback in route "/test-route"');
+
+ // Run the access check.
+ $this->accessChecker->access($route, $route_match, $account);
+ }
+
}
class TestController {