Installieren des Installationsprofils mit benutzerdefinierten Aufgaben

9

Für ein großes Projekt verwenden wir einen codegesteuerten Entwicklungsworkflow . Wir verwenden ein benutzerdefiniertes Installationsprofil, um die im Projekt verwendeten Contrib- und benutzerdefinierten Module zu installieren und zu konfigurieren. Um die Richtigkeit dieses Profils sicherzustellen, müssen wir es wie jedes andere Modul testen.

Derzeit verwenden wir einen SimpleTest-Testfall, der so aussieht und bisher gut funktioniert hat.

class FooTestCase extends DrupalWebTestCase {

  protected $admin_user = null;

  public function getInfo() {
    return array(
      'name' => 'Foo Profile',
      'description' => 'Ensure that the Foo profile configure the site.',
      'group' => 'Foo',
    );
  }

  public function setUp() {
    $this->profile = 'foo';
    parent::setUp();
  }

  //Test methods ...
}

Die Site muss mehrsprachig sein. Um alle erforderlichen Sprachen zu installieren und zu aktivieren, habe ich eine benutzerdefinierte Profilaufgabe mit hinzugefügt hook_install_tasks. Die Aufgabe funktioniert einwandfrei, wenn sie über den Browser ausgeführt wird. Es wird jedoch nicht ausgeführt, wenn DrupalWebTestCase :: setUp` ausgeführt wird. Daher können wir die Wirkung nicht testen, um sicherzustellen, dass sie nicht verloren gehen, unabhängig davon, wie unser Profil in Zukunft umgestaltet wird.

Da für die Installation von Sprachen Übersetzungen geladen werden müssen, verwendet die Aufgabe selbst die Stapelverarbeitung.

Ich suche sowohl nach einer Möglichkeit, diese bestimmte Aufgabe FooTestCase:setUpauszuführen, als auch allgemein nach allen (nicht interaktiven Aufgaben) in meinem Profil.

Als Referenz finden Sie hier den Code für die Aufgabe

function foo_install_tasks($install_state) {
  return array(on
    'foo_install_import_locales' => array(
      'display_name' => 'Install additional languages',
      'display' => TRUE,
      'type' => 'batch',
      'run' => INSTALL_TASK_RUN_IF_NOT_COMPLETED,
    )
  );
}

function foo_install_import_locales(&$install_state) {
  include_once DRUPAL_ROOT . '/includes/locale.inc';
  include_once DRUPAL_ROOT . '/includes/iso.inc';
  $batch = array();
  $predefined = _locale_get_predefined_list();
  foreach (array('nl', 'de') as $install_locale) {
    if (!isset($predefined[$install_locale])) {
      // Drupal does not know about this language, so we prefill its values with
      // our best guess. The user will be able to edit afterwards.
      locale_add_language($install_locale, $install_locale, $install_locale, LANGUAGE_LTR, '', '', TRUE, FALSE);
    }
    else {
      // A known predefined language, details will be filled in properly.
      locale_add_language($install_locale, NULL, NULL, NULL, '', '', TRUE, FALSE);
    }

    // Collect files to import for this language.
    $batch = array_merge($batch, locale_batch_by_language($install_locale, NULL));

  }
  if (!empty($batch)) {
      // Remember components we cover in this batch set.
      variable_set('foo_install_import_locales', $batch['#components']);
      return $batch;
  }
}
Pierre Buyle
quelle

Antworten:

6

Normalerweise finde ich es am besten, Ihr Installationsprofil so einfach wie möglich zu belassen und Aufgaben wie diese in hook_enable eines standortspezifischen Moduls zu platzieren. Ebenso sollten alle Aktualisierungen, die vorgenommen werden müssen, in hook_update_NFunktionen im selben Modul gespeichert werden, während die hook_enableImplementierung aktualisiert wird .

Dies erleichtert das Testen erheblich und bietet den zusätzlichen Vorteil, dass alle Einstellungen und Aktualisierungen an einem Ort aufbewahrt werden.

zroger
quelle