Рейтинг:1

How to import a custom content type in phpunit

флаг ph

I'm trying to write some PHPUnit Kernel tests that use a custom content type which seem to work until I try to reference fields on the content type. I'm guessing the content type isn't being imported from config. Is there a correct way to do this?

Example code which works in drush php but does not work in phpunit:

  public function createAction() {
    $storage = $this->container->get('entity_type.manager')->getStorage('node');
    $entity = $storage->create(['type' => 'action']);
    $entity->set('title', 'test');
    $entity->set('field_lookup_type', 'address');
    $entity->save();
    return $entity;
  }

The error from phpunit is "InvalidArgumentException: Field field_lookup_type is unknown."

Рейтинг:2
флаг in

Это не сработает. Для этого вам нужно либо создать тестовый модуль с конфигурациями YAML, либо написать сценарий изменений в методе настройки теста. Последний метод длиннее, но избавляет вас от необходимости поддерживать копии конфигураций YAML в дополнительных модулях. Вот пример.

  общедоступная функция setUp() {
    родитель::setUp();
    $this->entityTypeManager = $this->container->get('entity_type.manager');

    $this->installEntitySchema('узел');
    $this->installEntitySchema('пользователь');
    $this->installEntitySchema('taxonomy_term');
    $this->installSchema('узел', 'доступ к узлу');
    $this->installConfig('узел');
    $this->installConfig('таксономия');
    $this->installConfig('фильтр');

    $this->createContentType(['type' => 'my_content_type']);

    FieldStorageConfig::создать([
      'field_name' => 'field_lookup_type',
      'entity_type' => 'узел',
      'тип' => 'entity_reference',
      'мощность' => 1,
      'заблокировано' => ЛОЖЬ,
      'индексы' => [],
      'настройки' => [
        'handler' => 'default:taxonomy_term',
        'handler_settings' => [
          'target_bundles' => [],
          'сортировать' => [
            'поле' => 'имя',
            'направление' => 'по возрастанию',
          ],
          'auto_create' => ложь,
          'auto_create_bundle' => '',
        ],
      ]
    ])->сохранить();

    FieldConfig::создать([
      'field_name' => 'field_lookup_type',
      'entity_type' => 'узел',
      'label' => 'Мое поле',
      'комплект' => 'my_content_type',
      'описание' => '',
      'обязательно' => ЛОЖЬ,
      'настройки' => [],
    ])->сохранить();

Это создает тип узла, создает поле таксономии и устанавливает поле таксономии для этого типа узла. Это эквивалентно загрузке нескольких файлов YAML.

Затем либо в настройках, либо в самом тесте вы можете:

 $node = $this->createNode(['type' => 'my_content_type', 'field_lookup_type' => 1]);

Черты для этого должны быть включены в ваш тестовый класс:

  использовать NodeCreationTrait,
    ContentTypeCreationTrait,

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.