ほとんどのコアおよび多くの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()
APIを使用してこのように実装する必要がある理由はありますか?
Drupalのドキュメントに記載されているのは 最も単純なページ です。
テスト方法論Drupalテストは、単体テストではなく機能テストに焦点を当てています。これは、テストが個々の関数や有限のコードをテストする代わりに、インターフェース全体をテストするような方法です。Drupalは、より効果的なため、機能テストに焦点を当てていますDrupalが記述されています。機能テストは、ユニットテストよりも効果的ではないにしても、特にDrupalで使用されているコードスタイルにより、同じくらい効果的です。テストフレームワークはこのタイプのテストに向けられており、ドキュメントは記述に重点を置いています機能テスト。
Drupalテストはほとんどの場合機能テストであり、単体テストではありません。上記で引用したように、Drupalは、フックシステム、フォームAPIなど)でコーディングされており、ユニットテストでは一般的に意味がありません。