web-dev-qa-db-ja.com

「\ Drupal :: $ containerはまだ初期化されていません。\ Drupal :: setContainer()は実際のコンテナで呼び出す必要があります。」

私のサービスのPHPUnitテストを書こうとしています。

私のテストは次のようになります。

class CustomServiceTest extends UnitTestCase {

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

ただし、次の例外が発生します。

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

何が悪いのですか?

6
Potney Switters

テストで使用するサービスをモックして、値が返されるようにする必要があります。次のようにして行うことができます。

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);

}

Drupal\namespace\for\custom_utils\someresolverの代わりに、実際のインターフェース(またはインターフェースがない場合はクラス)を使用する必要があることに注意してください。

モックしたサービスから値を返すように期待を設定する必要があります。あなたはそれについてもっと読むことができます:

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

8
Jaypan