Test du profil d'installation avec des tâches personnalisées

9

Pour un grand projet, nous utilisons un workflow de développement basé sur le code . Nous utilisons un profil d'installation personnalisé pour installer et configurer les modules contrib et custom utilisés sur le projet. Pour garantir l'exactitude de ce profil, nous devons le tester comme tout autre module.

Actuellement, nous utilisons un scénario de test SimpleTest qui ressemble à ceci et qui a bien fonctionné jusqu'à présent.

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 ...
}

Le site doit être multilingue, afin d'installer et d'activer toutes les langues requises, j'ai ajouté une tâche de profil personnalisé en utilisant hook_install_tasks. La tâche fonctionne correctement lorsqu'elle est exécutée à partir du navigateur. Mais il n'est pas exécuté lorsque DrupalWebTestCase :: setUp` est exécuté. Nous ne pouvons donc pas tester son effet pour nous assurer qu'ils ne seront pas perdus, quelle que soit la refactorisation de notre profil à l'avenir.

Étant donné que l'installation des langues nécessite le chargement des traductions, la tâche elle-même utilise le traitement par lots.

Je cherche à la fois un moyen d'exécuter cette tâche particulière FooTestCase:setUpet plus généralement d'exécuter toutes les (tâches non interactives) de mon profil.

Pour référence, voici le code de la tâche

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
la source

Réponses:

6

Je trouve généralement préférable de laisser votre profil d'installation aussi simple que possible et de placer des tâches comme celle-ci dans hook_enable d'un module spécifique au site. De même, toutes les mises à jour qui doivent être effectuées doivent être mises en hook_update_Nfonctions dans le même module, tout en mettant à jour l' hook_enableimplémentation.

Cela le rend beaucoup plus simple à tester et présente l'avantage supplémentaire de conserver toute votre configuration et vos mises à jour au même endroit.

zroger
la source