October 16, 2012

Bazen işlevlerin yanlış parametrelere karşılık hata atmalarını isteriz. Bunu birim testlerinde denetlerken aşağıdaki gibi kodlar kullanıyorduk:

import std.exception;

double kareKök(double değer)
{
   enforce(değer >= 0, "Değer sıfırdan küçük olamaz");

   double sonuç;
   // ...
   return sonuç;
}

unittest
{
   auto hataAtıldı_mı = false;

   try {
       scope(failure) hataAtıldı_mı = true;
       kareKök(-1);

   } catch {
       // Hata önemli değil; atılmış olması yeterli.
   }

   assert(hataAtıldı_mı);
}

void main()
{}

O kadar kalabalık kodun daha kısa bir eşdeğeri olması gerektiğini düşünüyordum; varmış: std.exception.assertThrown. Anlamı, "şu işlemin hata attığını denetle" demekmiş. Onun sayesinde yukarıdaki birim testi içindeki kodlar tek satıra iniyor:

unittest
{
   assertThrown(kareKök(-1));
}

Atılan hatanın Exception veya ondan türeyen bir tür olduğunu varsayıyor. Özel bir hata türünün atılıp atılmadığı denetlenmek istendiğinde şablon parametresi olarak belirtiliyor:

   assertThrown!ÖzelBirHataTürü(birİşlem());

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]