Testowanie profilu instalacyjnego z niestandardowymi zadaniami

9

W przypadku dużego projektu korzystamy z przepływu pracy programistycznej opartej na kodzie . Używamy niestandardowego profilu instalacyjnego do instalowania i konfigurowania modułów contrib i niestandardowych używanych w projekcie. Aby zapewnić poprawność tego profilu, musimy go przetestować jak każdy inny moduł.

Obecnie używamy skrzynki testowej SimpleTest, która wygląda tak, jak do tej pory działała dobrze.

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

Witryna musi być wielojęzyczna, więc aby zainstalować i włączyć cały wymagany język, dodałem niestandardowe zadanie profilowe hook_install_tasks. Zadanie działa poprawnie po uruchomieniu z przeglądarki. Ale nie jest wykonywany, gdy DrupalWebTestCase :: setUp` jest uruchomiony. Dlatego nie jesteśmy w stanie przetestować jego działania, aby upewnić się, że nie zostaną utracone, niezależnie od tego, w jaki sposób w przyszłości przejdzie proces refaktoryzacji naszego profilu.

Ponieważ instalacja języków wymaga załadowania tłumaczeń, samo zadanie wykorzystuje przetwarzanie wsadowe.

Szukam zarówno sposobu na wykonanie tego konkretnego zadania, jak FooTestCase:setUpi bardziej ogólnie, aby wszystkie (nieinteraktywne zadania) w moim profilu zostały wykonane.

W celach informacyjnych znajduje się kod zadania

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
źródło

Odpowiedzi:

6

Zazwyczaj uważam, że najlepiej pozostawić profil instalacyjny możliwie najgorzej i umieścić takie zadania w hook_enable modułu określonego serwisu. Podobnie wszelkie aktualizacje, które należy wprowadzić, powinny zostać wprowadzone do hook_update_Nfunkcji w tym samym module, jednocześnie aktualizując hook_enableimplementację.

To znacznie ułatwia testowanie i ma dodatkową zaletę polegającą na utrzymywaniu wszystkich ustawień i aktualizacji w jednym miejscu.

zroger
źródło