CountDown
isminde fonksiyon yazacağız daha sonra main
metodunun içine koyacağız. Sonra bunun gibi gözükecek:Countdown
fonksiyonumuzun bir yere veri yazmasını istediğimizi biliyoruz ve io.Writer
Go'da bu yolu fiilen interface olarak yapmakta.main
içerisinde os.Stdout
'u göndereceğeğiz bu sayde kullanıcılarımız gerisayımın çıktılarını terminalde görebilecek.bytes.Buffer
göndereceğiz bu sayede testimiz üretilmiş veriyi yakalayabilecek../countdown_test.go:11:2: undefined: Countdown
Countdown
'ı tanımlacountdown_test.go:17: got '' want '3'
*bytes.Buffer
gibi olan) io.Writer
'ı parametre alan fmt.Fprint
kullanıyoruz ve ona string
gönderiyoruz. Şimdi test geçmeli*bytes.Buffer
çalışırken bunun yerine genel amaçlı bir interface kullanmanın daha iyi olacağını biliyoruz.main
'e bağlayalım, böylece ilerleme kaydettiğimizden emin olmak için çalışan bazı yazılımlarımız olur.string
oluşturmak için başba bir yoldur ancak testimiz için mükemmel olan yeni satırlar gibi şeyleri koymanıza izin verir.i--
ile geriye doğru sayan bir for
döngüsü kullan ve fmt.Println
kullanarak numaramızın ardından bir satır sonu karakteri ile out
çıktısını alın. Sonunda "Go!" göndermek için fmt.Fprint
'i kullan.time.Sleep
ile başarmamızı sağlar. Koda eklemeyi dene.Countdown
testi için test çalışmasına eklenen 4s'den memnun muyuz?Sleep
'e bağımlılığımız var ve bunu testlerimizde kontrol edebilmemiz için çıkarmamız gerekli.time.Sleep
'i mocklayabilirsek, "gerçek" time.Sleep
yerine dependency injection kullanabiliriz ve onlar hakkında iddialarda bulunmak için çağrıları gözetleyebilir.main
'de gerçek Sleeper ve testlerimizde spy sleeper kullanmamızı sağlar. Interface kullanarak `Countdown
fonksiyonumuz habersiz olur ve çağrıyı yapan için biraz esneklik ekler.Countdown
fonksiyonu uyku süresinden sorumlu olmayacak bir tasarıma karar verdim. Bu, kodumuzun en azından şimdilik biraz basitleştirir ve fonksiyonumuzun bir kullanıcısının bu uykuyu istedikleri gibi yapılandırılabileceği anlamına gelir.Sleep()
'in kaç kez çağırıldığını kaydediyoruz bu sayede testimizde kontrol edebiliyoruz.Sleeper
'ı kabul etmesi için Countdown
'u güncellemeliyizmain
fonksiyonunuz tekrar aynı sebeplerden derlenmeyecektirtime.Sleep
'i çağırıyoruz. Hadi bunu düzeltelim.Countdown
her çıktıdan önce uyumalı, örn:Uyu
N'i yazdır
Uyu
N-1'i yazdır
Uyu
Go!'yu yazdır
SpyCountdownOperations
,her çağrıyı bir slicea kaydederek io.Writer
ve Sleeper
'ı implemente eder. Bu testte sadece operasyonların sırası bizi alakadar etmekte bu yüzden sadece operasyonların ismini kadetmek yeterli.Countdown
'ı eski haline getirelim.Sleeper
üzerinde spylık yapan iki testimiz var, testimizi yeniden düzenleyebiliriz böylece biri yazılanları test eder diğeri de yazılanlar arasında uyuduğumuzdan emin olur. Sonunda, ilk spyımuzu kullanılmadığı için silebiliriz.Sleeper
'ın düzenlenebilir olması harika bir özellik olurdu. Bunun anlamı ana programımız içerisinden uyuma zamanını ayarlayabiliriz.ConfigurableSleeper
tipini oluşturalım.duration
'ı kullanıyoruz. sleep
'in metod imzası (signature) time.Sleep
ile aynı olması bize time.Sleep
'i gerçek uygulamada kullanmamızı, sleep
'i ise testlerimizde kullanmamızı sağlıyor:ConfigurableSleeper
'ımızda Sleep
metodunun olmadığını ima eden çok anlaşılabilir bir hata mesajı görmelisiniz.Sleep
fonksiyonumuzu implemente ettikten sonra başarısı olan bir testimiz var.ConfigurableSleeper
için Sleep
fonksiyonunuzu implemente etmek.ConfigurableSleeper
'ı kullanmak.ConfigurableSleeper
'ı kullandığımız için DefaultSleeper
'ı silmek artık güvenli. Programımızı tamamlıyoruz ve daha kapsamlı (generic) ve keyfi uzunlukta gerisayımları olan Sleeperımız oluyor.Mocklama zararlı olarak kabul edilir
diye paylaşım yaparsınız"Yinelemeli geliştirmeyi ne zaman kullanmalıyız? Yinelemeli geliştirmeyi sadece başarılı olmasını istediğiniz projelerde kullanmalısınız."