Saya ingin belajar sendiri untuk menggunakan pendekatan TDD dan saya punya proyek yang ingin saya kerjakan untuk sementara waktu. Itu bukan proyek besar jadi saya pikir itu akan menjadi kandidat yang baik untuk TDD. Namun, saya merasa ada sesuatu yang salah. Izinkan saya memberi contoh:
Pada tingkat tinggi, proyek saya merupakan tambahan untuk Microsoft OneNote yang memungkinkan saya melacak dan mengelola Proyek dengan lebih mudah. Sekarang, saya juga ingin menjaga logika bisnis untuk ini sebagai dipisahkan dari OneNote mungkin jika saya memutuskan untuk membangun penyimpanan kustom saya sendiri dan kembali suatu hari nanti.
Pertama saya mulai dengan tes penerimaan kata dasar sederhana untuk menguraikan apa yang saya ingin fitur pertama saya lakukan. Itu terlihat seperti ini (mematikannya untuk singkatnya):
- Klik pengguna membuat proyek
- Jenis pengguna dalam judul proyek
- Verifikasi bahwa proyek dibuat dengan benar
Melewati hal-hal UI dan beberapa perencanaan perantara saya datang ke unit test pertama saya:
[TestMethod]
public void CreateProject_BasicParameters_ProjectIsValid()
{
var testController = new Controller();
Project newProject = testController(A.Dummy<String>());
Assert.IsNotNull(newProject);
}
Sejauh ini baik. Merah, hijau, refactor, dll. Baiklah sekarang sebenarnya perlu menyimpan barang. Memotong beberapa langkah di sini saya berakhir dengan ini.
[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);
}
Saya masih merasa baik pada saat ini. Saya belum memiliki penyimpanan data yang konkret, tetapi saya membuat antarmuka seperti yang saya perkirakan akan terlihat.
Saya akan melewati beberapa langkah di sini karena posting ini sudah cukup lama, tetapi saya mengikuti proses yang sama dan akhirnya saya mendapatkan tes ini untuk penyimpanan data saya:
[TestMethod]
public void SaveNewProject_BasicParameters_RequestsNewPage()
{
/* snip init code */
testDataStore.SaveNewProject(A.Dummy<IProject>());
A.CallTo(() => oneNoteInterop.SavePage()).MustHaveHappened();
}
Ini bagus sampai saya mencoba mengimplementasikannya:
public String SaveNewProject(IProject project)
{
Page projectPage = oneNoteInterop.CreatePage(...);
}
Dan ada masalah di mana "..." berada. Saya menyadari sekarang pada titik INI bahwa CreatePage memerlukan ID bagian. Saya tidak menyadari hal ini kembali ketika saya berpikir pada level controller karena saya hanya peduli dengan pengujian bit yang relevan dengan controller. Namun, jauh-jauh di sini saya sekarang menyadari bahwa saya harus meminta pengguna untuk lokasi menyimpan proyek. Sekarang saya harus menambahkan ID lokasi ke datastore, lalu menambahkan satu ke proyek, lalu menambahkan satu ke controller, dan menambahkannya ke SEMUA tes yang sudah ditulis untuk semua hal itu. Ini menjadi sangat cepat dan membosankan dan saya merasa seperti saya akan menangkap ini lebih cepat jika saya membuat sketsa desain sebelumnya daripada membiarkannya dirancang selama proses TDD.
Bisakah seseorang tolong jelaskan kepada saya jika saya melakukan kesalahan dalam proses ini? Apakah ada jenis refactoring yang bisa dihindari? Atau ini biasa? Jika itu umum, adakah cara untuk membuatnya lebih tidak menyakitkan?
Terima kasih semuanya!