Merhaba Webkolog takipçileri! Bugünkü yazımda, Unit Test dünyasının belki de en havalı konusuna geldik: Mocking (Taklit Etme). Eğer "Her test yaptığımda veritabanına gerçekten kayıt mı atacağım?" veya "Ya internetim yoksa e-posta gönderme testim ne olacak?" diye düşünüyorsanız, bu yazı tam size göre.
Neden Mocking (Taklit Etme) Yapıyoruz?
Düşünün ki bir kodunuz var; kullanıcı kayıt olduğunda ona e-posta gönderiyor veya veritabanına bağlanıyor. Eğer bu kodu her test ettiğinizde gerçekten e-posta gönderirseniz:
- Testleriniz inanılmaz yavaşlar.
- Gereksiz yere binlerce test e-postası veya veritabanı şişkinliği oluşur.
- İnternet bağlantınız koptuğunda, kodunuz sağlam olsa bile testleriniz başarısız olur.
İşte burada devreye Mocking girer. Biz PHPUnit'e diyoruz ki: "Gerçek veritabanını veya e-posta servisini kullanma, onun yerine 'mış gibi' yapan sahte bir kopya oluştur."
1. Senaryo: Veritabanına Kayıt Yapan Bir Sınıf
Diyelim ki bir UserRegistration sınıfımız var ve bu sınıf çalışmak için Database sınıfına ihtiyaç duyuyor.
Dış Bağımlılık (src/Database.php):
namespace App;
class Database { public function save($data) { // Burada gerçekten veritabanına bağlandığını varsayalım return true;
} }
Asıl Sınıfımız (src/UserRegistration.php):
namespace App;
class UserRegistration { protected $db;
public function __construct(Database $db) {
$this->db = $db;
}
public function register($username) {
// Bazı işlemler yaptıktan sonra veritabanına kaydeder
return $this->db->save(['username' => $username]);
}
}
2. Test İçinde "Sahte" (Mock) Nesne Oluşturma
Şimdi UserRegistration sınıfını test edeceğiz ama Database sınıfının gerçek kodlarını çalıştırmayacağız. PHPUnit bizim yerimize o sınıfın boş bir kopyasını oluşturacak.
Test Dosyası (tests/UserRegistrationTest.php):
use PHPUnit\Framework\TestCase; use App\UserRegistration; use App\Database;
class UserRegistrationTest extends TestCase { public function testRegisterSavesUser() { // 1. Database sınıfının sahtesini (Mock) oluşturuyoruz $mockDb = $this->createMock(Database::class);
// 2. Beklenti oluşturuyoruz:
// "save" metodu tam 1 kere çağrılmalı ve her zaman "true" dönmeli.
$mockDb->expects($this->once())
->method('save')
->willReturn(true);
// 3. Gerçek veritabanı nesnesi yerine sahte nesneyi enjekte ediyoruz
$registration = new UserRegistration($mockDb);
$result = $registration->register('selim');
// 4. Sonucu kontrol et
$this->assertTrue($result);
}
}
Burada ne oldu? Biz aslında veritabanına hiç dokunmadık. PHPUnit arka planda o sınıfın bir kopyasını oluşturdu ve biz sadece "save metodu çağrılırsa hata verme, 'evet' de geç" dedik. Böylece sadece kendi yazdığımız mantığı test etmiş olduk.
Unit Test'in Altın Kuralı: Red-Green-Refactor
Profesyonel yazılımcıların izlediği şu döngüyü kulağınıza küpe yapmanızı öneririm:
- Red (Kırmızı): Önce testi yazın (henüz kod olmadığı için test kalacaktır).
- Green (Yeşil): Testi geçirecek kadar minimum kodu yazın.
- Refactor (Düzenle): Kodu daha şık ve performanslı hale getirin (testler yeşil kalmaya devam etmeli!).
Mocking sayesinde artık dış dünyadan bağımsız, ışık hızında testler yazabilirsiniz. Bir sonraki yazımızda görüşmek üzere!
Webkolog'u takipte kalın!
Hepinize bol kodlu ve başarılı projeler dilerim!
Hiç yorum yok:
Yorum Gönder