web-dev-qa-db-ja.com

カーネルテストで何をセットアップして、カスタムコンテンツタイプを利用可能にするか

サービスとカスタムコンテンツタイプを定義するカスタムモジュールがあります。サービスの機能テストを作成しました。現在、代わりにカーネルテストを記述できるかどうかを確認しています。

私が遭遇している問題は、私のカスタムコンテンツタイプに(当然)カスタムフィールドがあることです。カーネルテスト環境でそのタイプのコンテンツを作成すると、Drupalがカスタムフィールドを認識しません。

  • EntityKernelTestBaseを使用しています。
  • 設定しましたpublic static $modules = array('my_custom_module', 'node');

何が欠けていますか?これらのカスタムフィールドが認識されるように、インストールするために言う必要があるスキーマや、呼び出す必要があるその他のメソッドがあると思います。

_<?php

namespace Drupal\Tests\my_custom_module\Kernel;

use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
use Drupal\node\Entity\Node;

/**
 * Tests the my custom service.
 *
 * @group my_custom_module
 */
class MyCustomServiceKernelTest extends EntityKernelTestBase {

  /**
   * Modules to install.
   *
   * @var array
   */
  public static $modules = array('my_custom_module', 'node');

  /**
   * {@inheritdoc}
   */
  public function setUp() {

    parent::setup();

    $user = $this->createUser();

    $container = \Drupal::getContainer();
    $container->get('current_user')->setAccount($user);

    // Create some aquifer pieces of content
    $node = Node::create(array(
      'title' => t('Some title'),
      'type' => 'my_custom_content_type',
      'language' => 'en',
      'field_my_custom_field_1' => 'Put stuff here',
      'field_my_custom_field_2' => 'more stuff',
      'field_my_custom_field' => 1000000,
    ));
    $node->save();
    $reloaded_entity = $this->reloadEntity($node);
    $this->assertSame('debug', $reloaded_entity);
  }
}
_

Debug assertステートメントは、再ロードされたエンティティにカスタムフィールドが含まれていないことを示しています。

これらのフィールドを_Node::create_ロジックで渡す代わりに$node->set('field_my_custom_field_1', 'some value')ステートメントをコードに挿入すると、フィールド名が無効であるというエラーが発生します。

5
vegantriathlete

カーネルテストでは、インストールする構成を指定する必要があります。たとえば、テストのsetUp()メソッドには次のようなものが必要です。

$this->installConfig(['my_custom_module']);

これはモジュールの配列を取るため、おそらく追加のモジュールを指定する必要があります(filternode、およびfieldなどの可能性があります)。

これは、フィールド構成がモジュールのconfig/installディレクトリにバンドルされていることを前提としています。

8
jhedstrom