cangelis yazdı
Senin kodunda gördüğüm kadarıyla birim test değil functional test yapıyorsun. Yani birşeyi mocklamadan direk veritabanı bağlantısı ile çalışması gerekiyor kodlarının bu yüzden test caselerde migrationları da çalıştırmalısın. Eğer ki benim amacım bu değil diyorsan veritabanı ile ilişkiye giren sınıfları mocklamalısın. Bu konuda da herhangi birşeye ihtiyacın olursa bir de controller kodlarını gönderirsen iyi olur.
Cevabın için teşekkürler @cangelis. İlk defa unit test yazıyorum. Zaten unit de olmamış. Mesela controllerım şu:
class HalisahalarController extends BaseController {
/**
* Halı saha account nesnesini tutan değişken
*/
protected $halisahaAccount;
/**
* AuthControl nesnesini tutar
*/
protected $authControl;
public function __construct (HalisahaAccount $halisahaAccount, AuthControl $authControl) {
$this->halisahaAccount = $halisahaAccount;
$this->authControl = $authControl;
}
/**
* Halı sahaların listelendiği sayfa
*
*/
public function getIndex(){
// sayfada kullanılacak halısahaların verileri getirilir
$halisahalar = $this->halisahaAccount->with(
'halisahaInformation',
'halisahaAdress.county.province',
'services',
'halisahaCoverPhoto',
'halisahaUrl')->get()->toArray();
// oturum kontrol edilir ve oturum sahibinin değerleri oluşturulur
$this->authControl->account();
return View::make('index',array('halisahalar' => $halisahalar));
}
}
Bu controller hakkında soracağım bazı sorular var.
1.1)
__construct metodunda bağımlı olduğum sınıfları controllera ekledim. Bu işlem ile dependency injection kuralına uymuş oluyor muyum? Yoksa kendimi mi avutuyorum.
1.2)
getIndex metodunda eloquent kullanarak veri çekiyorum. Ateşli yükleme yaparak ilişkili tablolardan veriler sorunsuz geliyor. Fakat sizin önereceğiniz bir başka yöntem var mı?
Bu da controllerın test kodları
class HalisahalarControllerTest extends TestCase {
/**
* halısahaların listelendiği sayfa yükleniyor mu
*/
public function testGetIndex(){
fwrite(STDOUT, __METHOD__ . " started\n");
// sayfa çağrılır
$this->action('GET', 'HalisahalarController@getIndex');
fwrite(STDOUT, " action GET HalisahalarController@getIndex called\n");
// yanıt başarılı bir şekilde geldi mi
$this->assertResponseOk();
fwrite(STDOUT, " assert response is ok\n");
// 200 kodu geldi mi
$this->assertResponseStatus(200);
fwrite(STDOUT, " assert response status is 200\n");
// veri view içinde var mı
$this->assertViewHas('halisahalar');
fwrite(STDOUT, " assert view has halisahalar\n");
fwrite(STDOUT, __METHOD__ ." is finished \n_____\n");
}
}
Bu kodlar hakkında da bazı sorularım olacak:
2.1)
$this->action('GET', 'HalisahalarController@getIndex') satırında sayfa çağrıldığında veritabanı gereksinimi duyuyor. Neyse onu yukardaki testCase kodlarım ile çözdüm (
db:seed) kullanmadan. Burada bir sıkıntı var mı?
2.2) Bu sayfada sadece halı sahaları listeliyorum. Ve eğer kullanıcı oturum açıksa, üst başlıkta kişisel bir menüsü olacak. Böyle bir sayfa için; Bu testte gereksiz yapılan bir test var mı? Veya eksik, yani yapılmamış bir test var mı? Yani siz olsanız böyle bir sayfanın controllerında nasıl bir test yazarsınız?
2.3) Fonksiyonel test yanılmıyorsam işleyişi test ediyordu. Birim test ise en küçük birimler olan metotları. Ben burada
getIndex metodunu test etmek istedim. Ama fonksiyonel olmuş. Yani burada yalnış bir algıya sahibim galiba. Mesela bu test kodumun birim test olması için nelerin olması ve nelerin olmaması gerekir?
2.4) Fonksiyonel test için
codeception kullanacağım. Bu konuda bir tavsiyeniz var mı?
cangelis yazdıEk olarak; 24 test için 5 saniye uzun bir süre.
Heralde veritabanı migrate işlemleri için bu kadar sürüyor. Testler arttıkça doğru orantılı bir şekilde artacağını düşünmüyorum. Yanılıyor muyum?