Bu yazıyı okumadan önce Lullabot.com’un Drupal için “Unit Test” yazımına başlangıç makalesini okumanızı öneririm.
Aşağıda anlatacağım yöntemler Drupal 7 sürümü için geçerlidir. Drupal 6 için bazı değişiklikler yapılması gerekebilir.
Geçen hafta Drupal’ın geliştirilmekte olan 7.x sürümü için bir yama hazırladım. Aggregator eklentisine OPML içe aktarım özelliğini getiren bu yama için bazı testler yazmam gerekti. Drupal, 7.x sürümü ile birlikte kendi test eklentisine kavuştuğu için artık testleri ile birlikte gönderilmeyen yamalar çekirdek dağıtıma kabul edilmiyor.
OPML içe aktarım özelliği için Aggregator menüsüne yeni bir form sayfası eklenmesi gerekiyordu. Kendi halinde bir sayfaya yerleştirilmiş bu form için yazdığım testler başka formlar için tam bir test kalıbı oluşturacak nitelikte oldu.
Bir Drupal formunu 3 adımda test edebiliriz. Birinci adımda önce formu oluşturur sonra beklediğimiz form alanlarının basılıp basılmadığını test ederiz.
/** * OPML içe aktarım formunu oluştur. */ function testOPMLImportForm() { $this->drupalGet('admin/content/aggregator/add/opml'); $this->assertText('A single OPML document may contain a collection of many feeds.', t('Yardım metninin görüntülenmesi test ediliyor.')); $this->assertFieldByName('files[upload]', '', t('Dosya yükleme alanının görüntülenmesi test ediliyor.')); $this->assertFieldByName('remote', '', t('OPML dosyası adresi alanının görüntülenmesi test ediliyor.')); $this->assertFieldByName('refresh', '', t('Güncelleme alanının görüntülenmesi test ediliyor.')); $this->assertFieldByName('category[1]', '1', t('Dizin listesi alanının görüntülenmesi test ediliyor.')); }
İkinci adımda form alanlarına aklımıza gelen bütün geçersiz bilgileri gireriz. Daha sonra formu gönderip ne gibi hata mesajları verdiğini test ederiz.
/** * OPML içe aktarım formunu geçersiz bilgiler ile gönder. */ function testOPMLImportFormValidate() { $form = array(); $this->drupalPost('admin/content/aggregator/add/opml', $form, t('Import')); $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), t('Bilgi alanları boş bırakılmamalı hatası test ediliyor.')); $path = $this->getEmptyOpml(); $form = array( 'files[upload]' => $path, 'remote' => file_create_url($path), ); $this->drupalPost('admin/content/aggregator/add/opml', $form, t('Import')); $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), t('Dosya yükleme ve adres alanlarından yalnızca biri doldurulmalı hatası test ediliyor.')); $form = array('remote' => 'invalidUrl://empty'); $this->drupalPost('admin/content/aggregator/add/opml', $form, t('Import')); $this->assertText(t('This URL is not valid.'), t('Girilen adres geçersiz hatası test ediliyor.')); }
Üçüncü ve son adımda form alanlarına geçerli bilgiler gireriz. Formu gönderdiğimizde girdiğimiz bilgilerin beklediğimiz gibi işleyip işlemediğini test ederiz.
/** * OPML içe aktarım formunu geçerli bilgiler ile gönder. */ function testOPMLImportFormSubmit() { $feeds[0] = $this->getFeedEditArray(); $form = array( 'files[upload]' => $this->getValidOpml($feeds), 'refresh' => '900', 'category[1]' => 'gezegen', ); $this->drupalPost('admin/content/aggregator/add/opml', $form, t('Import')); $feeds_from_db = db_query("SELECT f.title, f.url, f.refresh, cf.cid FROM {aggregator_feed} f LEFT JOIN {aggregator_category_feed} cf ON f.fid = cf.fid"); $refresh = $category = TRUE; while ($feed = db_fetch_array($feeds_from_db)) { $title[$feed['url']] = $feed['title']; $url[$feed['title']] = $feed['url']; $category = $category && $feed['cid'] == 1; $refresh = $refresh && $feed['refresh'] == 900; } $this->assertEqual($title[$feeds[0]['url']], $feeds[0]['title'], t('Veritabanı kaydı tespit edildi.')); $this->assertTrue($refresh, t('Güncelleme bilgisi doğrulandı.')); $this->assertTrue($category, t('Dizin bilgisi doğrulandı.')); }