web-dev-qa-db-ja.com

簡単なテストでプログラムでノードを作成しないのはなぜですか?

ほとんどのコアおよび多くのcontrib simpletestテストは、インターフェースを準備してノードを作成し、管理者をログインして、_/node/add/foo_のフォームに入力します。これはひどく遅いだけでなく、テストの最も基本的なルールで失敗します。自分の懸念だけをテストしてください。残りをモックしてスタブします。

テストに必要なのは、Xタグ(分類用語)が付加されたNノードだけです。どこかに「保存」ボタンが存在するかどうかに(私は)関心がありません。これは、コアテスト(たとえば、ヘルパー関数createNodesWithTags())を実行するときにテストするものです。

このヘルパーは、myと同じ問題があるTaxonomyRSSTestCaseをモデルにしています。タグ付きのノードがいくつかあることを確認し、これらのノードを使用してインターフェイスをテストできるようにします。ヘルパーは最初にノードタイプ「article」にエンティティフィールドを作成します。エンティティフィールドを作成しないと、そのノードにタグを追加できません。次に、_node/add/article_ページを開き、用語を添付してSaveを押します。

_  private function createNodesWithTags($amount) {
    $field = array(
      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
      'type' => 'taxonomy_term_reference',
      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
      'settings' => array(
        'allowed_values' => array(
          array(
            'vocabulary' => $this->vocabulary->machine_name,
            'parent' => 0,
          ),
        ),
      ),
    );
    field_create_field($field);

    $this->instance = array(
      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
      'bundle' => 'article',
      'entity_type' => 'node',
      'widget' => array(
        'type' => 'options_select',
      ),
      'display' => array(
        'default' => array(
          'type' => 'taxonomy_term_reference_link',
        ),
      ),
    );
    field_create_instance($this->instance);

    //Create N nodes and attach all N to tag1, N-1 to tag2, N-2 to tag3 etc.
    $attachable = $this->tags;
    for ($i = 0; $i < $amount; $i++) {
      // Post an article.
      $edit = array();
      $langcode = LANGUAGE_NONE;
      $edit["title"] = $this->randomName();
      foreach($attachable as $tag) {
        $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $tag->tid;
      }
      $this->drupalPost('node/add/article', $edit, t('Save'));

      //remove one tag, so the next node gets one less tag attached.
      array_shift($attachable);
    }
  }
_

なぜコアテストはこのようにテストするのですか?ノードの保存が機能するかどうか(つまり、管理者を作成してログインし、[保存]ボタンを見つけることができるかどうか)にTaxonomyTestCaseが関係するのはなぜですか?なぜnode_save()または他のAPIを呼び出さないのですか?

データベースにレコードを単にドロップするのではなく、node_save() AP​​Iを使用してこのように実装する必要がある理由はありますか?

4
berkes

Drupalのドキュメントに記載されているのは 最も単純なページ です。

テスト方法論Drupalテストは、単体テストではなく機能テストに焦点を当てています。これは、テストが個々の関数や有限のコードをテストする代わりに、インターフェース全体をテストするような方法です。Drupalは、より効果的なため、機能テストに焦点を当てていますDrupalが記述されています。機能テストは、ユニットテストよりも効果的ではないにしても、特にDrupalで使用されているコードスタイルにより、同じくらい効果的です。テストフレームワークはこのタイプのテストに向けられており、ドキュメントは記述に重点を置いています機能テスト。

Drupalテストはほとんどの場合機能テストであり、単体テストではありません。上記で引用したように、Drupalは、フックシステム、フォームAPIなど)でコーディングされており、ユニットテストでは一般的に意味がありません。

4
Thomas4019