web-dev-qa-db-ja.com

Behatテストでエンティティ参照フィールド値を追加する方法

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

@api
Scenario: Testing user
Given users:
    | name | pass | mail    | status | roles  | field_lines_ref |
    | test | test | [email protected] | 1      | Tester | Line Name       |

field_lines_refはノードへのエンティティ参照です。ユーザーは作成されますが、Lines Referenceフィールドは入力されません。ノードIDも使用してみましたが、機能しませんでした。

注意すべき点の1つは、「ライン名」を作成したノードが既にあり、ロジック(ノードIDに基づく)が適切であるため、正確なノードを使用する必要があることです。

6
albertski

エンティティ参照フィールドがある場合は、エンティティの名前/タイトル/ラベルフィールドでエンティティを参照する必要があります(これは分類用語にも当てはまります)。あなたがしたように。

このコードは関連付けに対して実行されます。

/**
 * Entityreference field handler for Drupal 7.
 */
class EntityreferenceHandler extends AbstractHandler {

  /**
   * {@inheritdoc}
   */
  public function expand($values) {
    $entity_type = $this->fieldInfo['settings']['target_type'];
    $entity_info = entity_get_info($entity_type);
    // For users set label to username.
    if ($entity_type == 'user') {
      $entity_info['entity keys']['label'] = 'name';
    }

    $return = array();
    foreach ($values as $value) {
      $target_id = db_select($entity_info['base table'], 't')
        ->fields('t', array($entity_info['entity keys']['id']))
        ->condition('t.' . $entity_info['entity keys']['label'], $value)
        ->execute()->fetchField();
      if ($target_id) {
        $return[$this->language][] = array('target_id' => $target_id);
      }
    }
    return $return;
  }

}

つまり、最初のアイテムはユーザーに関連付けられるよう試みられます。つまり、関連付けが可能なわけではありません(つまり、コンテンツタイプの制限のため)。したがって、関連付けたい名前のエンティティが1つだけあることを確認してください。また、値に「、」、「-」が含まれていないことを確認してください。これらは複数の値に変換され、「-」が存在する場合、「:」の値はkey: valueのペアに変換されます。そのフィールド内で参照できるエンティティ名を正確に言う必要があります(ただし、コードで確認できる限り、名前フィールドの値の前後にスペースがないことを確認してください。上のクエリはエンティティが見つからない場合があります)。また、フィールドが実際のフィールドであるかどうかを確認します(フィールドではないパス 'field'とは異なります)、それを実行でき、field_info_field_map()コマンドを実行して、フィールドマシン名が見つかったかどうかを確認しますそこでは、キーとして、あなたは大丈夫です。

上記のすべてが満たされ、ユーザーのfield_lines_refフィールドで参照できるノードがすでにあり、ノードのタイトルが「行名」である場合、参照を使用してユーザーを作成できるはずです。

Given users:
    | name | pass | mail    | status | roles  | field_lines_ref |
    | test | test | [email protected] | 1      | Tester | Line Name       |

機能ファイルから、または

$user_obj = (object) array(
  'name' => 'test',
  'pass' => 'test',
  'mail' => '[email protected]',
  'status' => '1',
  'roles' => 'Tester',
  'field_lines_ref' => 'Line Name',
);
$user = $this->userCreate($user_obj);

コンテキストオブジェクトから。

これらの方法で問題が解決しない場合は、独自のコード(ベンダーコードを含む)をデバッグして、どこに問題があるかを確認する必要があります。

1
golddragon007

この行に沿ってContext.phpファイルに 'Given'関数とその他のサポート関数を作成します...

/**
 * @Transform :user
 */
public function castUsernameToUser($user) {
    $user_loaded = user_load_by_name ( $user );
    if (!$user_loaded) {
        throw new \Exception('User was not found: ' . $user);
    }
    return $user_loaded;
}

/**
 * @Transform :field_line
 */
public function castFieldLineToNode($field_line) {
    //load your node using the name 
    return $node;
}

/**
 * @Given :user has field line :field_line
 */
public function userHasFieldLine($user, $field_line) {
    $user->set ( 'field_lines_ref', $field_line);
    $user->save ();
}

次に、ユーザーを作成した後、次のようにステップを機能ファイルに追加します。

And "test" has field line "Line Name"
0
Eric C.