Kendime TDD yaklaşımını kullanmayı öğretmek istedim ve bir süredir üzerinde çalışmak istediğim bir projem vardı. Büyük bir proje değildi, bu yüzden TDD için iyi bir aday olacağını düşündüm. Ancak, bir şey ters gitti gibi hissediyorum. Bir örnek vereyim:
Üst düzeyde projem, Microsoft OneNote için Projeleri daha kolay izlememe ve yönetmeme olanak tanıyan bir eklentidir. Şimdi, bunun için iş mantığını OneNote'tan ayrıştırılmış olarak tutmak istedim, çünkü kendi özel depolama alanımı oluşturmaya karar verdim ve bir gün arka uç.
İlk olarak, ilk özelliğimin ne yapmasını istediğimi açıklamak için basit bir düz kelime kabul testiyle başladım. Böyle bir şeye benziyor (kısalık için onu batırıyor):
- Kullanıcı proje oluştur'u tıklar
- Proje başlığında kullanıcı türleri
- Projenin doğru oluşturulduğunu doğrulayın
Kullanıcı arayüzü öğelerini atlama ve bazı aracı planlama İlk birim testime geliyorum:
[TestMethod]
public void CreateProject_BasicParameters_ProjectIsValid()
{
var testController = new Controller();
Project newProject = testController(A.Dummy<String>());
Assert.IsNotNull(newProject);
}
Çok uzak çok iyi. Kırmızı, yeşil, refactor, vb. Tamam. Burada bazı adımları keserek bununla bitiyorum.
[TestMethod]
public void CreateProject_BasicParameters_ProjectMatchesExpected()
{
var fakeDataStore = A.Fake<IDataStore>();
var testController = new Controller(fakeDataStore);
String expectedTitle = fixture.Create<String>("Title");
Project newProject = testController(expectedTitle);
Assert.AreEqual(expectedTitle, newProject.Title);
}
Bu noktada hala iyi hissediyorum. Henüz somut bir veri mağazam yok, ancak arayüzün nasıl görüneceğini tahmin ettiğimi oluşturdum.
Bu yazı yeterince uzun sürdüğü için burada birkaç adım atlayacağım, ancak benzer işlemleri takip ettim ve sonunda veri deposum için bu sınava giriyorum:
[TestMethod]
public void SaveNewProject_BasicParameters_RequestsNewPage()
{
/* snip init code */
testDataStore.SaveNewProject(A.Dummy<IProject>());
A.CallTo(() => oneNoteInterop.SavePage()).MustHaveHappened();
}
Ben uygulamaya çalışana kadar bu iyi oldu:
public String SaveNewProject(IProject project)
{
Page projectPage = oneNoteInterop.CreatePage(...);
}
Ve "..." nin olduğu yerde sorun var. Şimdi bu noktada CreatePage bir bölüm kimliği gerektirdiğini anlıyorum. Kontrolör seviyesinde düşünürken bunu fark etmedim çünkü sadece kontrolörle ilgili bitleri test etmekle ilgilendim. Ancak, burada tüm yol şimdi kullanıcıdan projeyi saklamak için bir konum sormak zorunda olduğumu fark ediyorum. Şimdi veri deposuna bir konum kimliği eklemeliyim, sonra projeye bir tane eklemeliyim, sonra denetleyiciye bir tane eklemeliyim ve bunları tüm bunlar için yazılmış olan TÜM testlere eklemeliyim. Çok hızlı bir şekilde sıkıcı hale geldi ve TDD süreci sırasında tasarlanmasına izin vermek yerine tasarımı önceden çizmiş olsaydım bu kadar hızlı yakalayabileceğimi hissediyorum.
Bu süreçte yanlış bir şey yaptıysam birisi bana açıklayabilir mi? Yine de bu tür bir yeniden düzenleme önlenebilir mi? Yoksa bu yaygın mı? Yaygın ise, daha acısız hale getirmenin herhangi bir yolu var mı?
Hepinize teşekkürler!