web-dev-qa-db-ja.com

構成をモック構成オブジェクトに挿入する

Drupal 8で、いくつかの構成変数を使用するUnitTestCaseに基づいてユニットテストを設定しようとしています。残念ながら、これらの構成変数をシステムのシステムに挿入する方法を見つけることができませんでした。セットアップ(検索Drupalドキュメントと構成Drupal単体テストの例))なので、テストされる関数は常にnull configで動作し、失敗します。個々の機能を個別にテストするため、ブラウザーのテストはこれにはあまり適していません。

問題を説明/再現するために必要な最小限のコードに問題を簡略化しました。ここに3つのコンポーネントがあります。テストした関数から読み取れるように、mock/setupのどこにarray('bucketName' => 'test_bucket')およびその他のプロパティを挿入しますか?

関数:

public function example() {
    return \Drupal::config('my_module.job')->get('my_module.bucketName');
}

テスト機能:

public function testExample() {
    $myModuleHelper = new MyModuleHelper();
        $expected_config = array(
            'bucketName' => 'test_bucket',
        );

    $this->assertEquals($expected_config, $myModuleHelper->example());
}

テスト設定:

public function setUp() {
    $this->config = $this->getMockBuilder('\Drupal\Core\Config\ImmutableConfig')
        ->disableOriginalConstructor()
        ->getMock();

    $this->configFactory = $this->getMockBuilder('\Drupal\Core\Config\ConfigFactory')
        ->disableOriginalConstructor()
        ->getMock();
    $this->configFactory->expects($this->any())
        ->method('get')
        ->with('my_module.job')
        ->willReturn($this->config);

    $this->container = new ContainerBuilder();
    $this->container->set('config.factory', $this->configFactory);
    \Drupal::setContainer($this->container);
}

テスト応答:

nullは、予期される型「配列」と一致しません。

5
Ynhockey

Configオブジェクトのモックにも_::get_メソッドがあり、配列を使用して適切な値を返す必要があります。コアのUnitTestCaseクラスは::getConfigFactoryStub(array $configs)を提供し、これはすべてこれを自動的に行います。

セットアップで、次のように構成ファクトリを作成します。

_$this->configFactory = $this->getConfigFactoryStub([
  'mymodule.job' => ['bucketName' => 'test_bucket'],
]);
_

残念ながら、モック構成は実際の構成オブジェクトのようには機能しません。つまり、ドット付きキーは受け付けず、最上位のキーのみを受け付けます。以下は機能しません。

_$this->configFactory = $this->getConfigFactoryStub([
  'mymodule.settings' => [
    'key' => [
      'subkey' => [
        'subsubkey' => 'value',
      ],
    ],
  ],
]);
$this->container = new ContainerBuilder();
$this->container->set('config.factory', $this->configFactory);
\Drupal::setContainer($this->container);

\Drupal::config('mymodule.settings')->get('key.subkey.subsubkey');
_

このバグレポートは回避策を示しています。 https://www.drupal.org/node/2862248

4

KernelTestBase (for "functional"テストを使用している場合、ブートストラップされたDrupalで実行され、 services )、次に この回答 を参照して、KernelTestBase::config()を使用して、注入されたconfig.factoryサービス。

これは、Drupalが完全にセットアップされていないため、UnitTestCaseを拡張するテストでは機能しないことに注意してください。

0
Adam Franco