it-swarm.com.de

"\ Drupal :: $ container ist noch nicht initialisiert. \ Drupal :: setContainer () muss mit einem echten Container aufgerufen werden."

Ich versuche, einen PHPUnit-Test für einen meiner Dienste zu schreiben.

Mein Test sieht wie folgt aus.

class CustomServiceTest extends UnitTestCase {

  public function testDefaultBehavior() {
    $service = new CustomService(\Drupal::service('custom_utils.some_resolver'), \Drupal::configFactory());
    $service->execute();
  }
}

Es wird jedoch die folgende Ausnahme ausgelöst.

Drupal\Core\DependencyInjection\ContainerNotInitializedException:
\Drupal::$container is not initialized yet. \Drupal::setContainer() must be called with a real container.

Was mache ich falsch?

6
Potney Switters

Sie müssen die Dienste verspotten, die Sie in Ihrem Test verwenden, damit sie Werte zurückgeben. Sie können dies wie folgt tun:

public function testDefaultBehavior() {
  $some_resolver = $this->getMockBuilder('Drupal\namespace\for\custom_utils\someresolver')
    ->disableOriginalConstructor()
    ->getMock();
  $config_factory = $this->getMockBuilder('Drupal\Core\Config\ConfigFactory')
    ->disableOriginalConstructor()
    ->getMock();
    $service = new CustomService($some_resolver, $config_factory);

}}

Beachten Sie, dass Sie anstelle von Drupal\namespace\for\custom_utils\someresolver Die eigentliche Schnittstelle (oder Klasse, wenn Sie keine Schnittstelle haben) verwenden sollten.

Sie müssen Erwartungen einrichten, um die Werte der von Ihnen verspotteten Dienste zurückzugeben. Mehr dazu lesen Sie hier:

https://www.drupal.org/docs/8/phpunit/understanding-phpunit-expectations

8
Jaypan