it-swarm.com.de

Hinzufügen eines Entitätsreferenzfeldwerts in Behat Test

Mein Behat-Test beginnt folgendermaßen:

@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 ist eine Entitätsreferenz auf einen Knoten. Der Benutzer wird erstellt, aber das Feld Linienreferenz wird nie ausgefüllt. Ich habe auch versucht, die Knoten-ID zu verwenden, aber es hat auch nicht funktioniert.

Eine Sache zu beachten ist, dass ich bereits einen Knoten "Zeilenname" erstellt habe und diesen genauen Knoten aufgrund der vorhandenen Logik verwenden muss (basierend auf der Knoten-ID).

6
albertski

Wenn Sie ein Entitätsreferenzfeld haben, müssen Sie auf die Entität mit ihrem Feld Name/Titel/Bezeichnung verweisen (dies gilt auch für Taxonomiebegriffe). Wie du es getan hast.

Dieser Code wird für Ihre Vereinigung ausgeführt:

/**
 * 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;
  }

}

Dies bedeutet auch, dass versucht wird, das erste Element mit Ihrem Benutzer zu verknüpfen, was nicht bedeutet, dass dies möglich ist (d. H. Zur Einschränkung des Inhaltstyps). Stellen Sie also sicher, dass Sie nur eine Entität haben, deren Name so ist, wie Sie ihn zuordnen möchten. Stellen Sie außerdem sicher, dass Ihr Wert nicht ',' und '-' enthält, da diese in einen Mehrfachwert konvertiert werden. Wenn '-' vorhanden ist, wird der Wert ':' in key: value Paare. Sie müssen genau den Entitätsnamen angeben, auf den in diesem Feld verwiesen werden kann (aber soweit ich im Code sehen kann, stellen Sie sicher, dass vor und/oder nach dem Wert des Namensfelds kein Leerzeichen vorhanden ist, da die obige Abfrage kann Ihre Entität möglicherweise nicht finden). Überprüfen Sie auch, ob Ihr Feld ein reales Feld ist (nicht wie der Pfad 'Feld', der kein Feld ist). Führen Sie dazu den Befehl field_info_field_map() aus und finden Sie den Namen Ihres Feldcomputers dort geht es dir als Schlüssel gut.

Wenn alle oben genannten Voraussetzungen erfüllt sind und Sie bereits einen Knoten haben, auf den über das Feld field_lines_ref Des Benutzers verwiesen werden kann, und der Knotentitel "Zeilenname" lautet, sollten Sie Ihren Benutzer mit der folgenden Referenz erstellen können:

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

Aus der Feature-Datei oder

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

vom Kontextobjekt.

Wenn dies nicht hilft, müssen Sie möglicherweise Ihren eigenen Code (einschließlich Herstellercode) debuggen, um festzustellen, wo das Problem liegt.

1
golddragon007

Erstellen Sie eine 'Given'-Funktion und andere unterstützende Funktionen in Ihrer Context.php-Datei entlang dieser Linie ...

/**
 * @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 ();
}

Fügen Sie Ihrer Feature-Datei nach dem Erstellen des Benutzers einen Schritt hinzu:

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