Ketika melakukan TDD dan menulis unit test, bagaimana seseorang menahan keinginan untuk "menipu" ketika menulis iterasi pertama dari kode "implementasi" yang Anda uji?
Sebagai contoh:
Mari saya perlu menghitung faktorial suatu angka. Saya mulai dengan tes unit (menggunakan MSTest) sesuatu seperti:
[TestClass]
public class CalculateFactorialTests
{
[TestMethod]
public void CalculateFactorial_5_input_returns_120()
{
// Arrange
var myMath = new MyMath();
// Act
long output = myMath.CalculateFactorial(5);
// Assert
Assert.AreEqual(120, output);
}
}
Saya menjalankan kode ini, dan gagal karena CalculateFactorial
metode ini bahkan tidak ada. Jadi, saya sekarang menulis iterasi pertama dari kode untuk mengimplementasikan metode yang diuji, menulis kode minimum yang diperlukan untuk lulus tes.
Masalahnya, saya terus tergoda untuk menulis yang berikut ini:
public class MyMath
{
public long CalculateFactorial(long input)
{
return 120;
}
}
Hal ini, secara teknis, benar bahwa itu benar-benar adalah kode minimum yang diperlukan untuk membuat tes khusus lulus (go green), meskipun jelas "menipu" karena benar-benar bahkan tidak berusaha untuk melakukan fungsi menghitung faktorial. Tentu saja, sekarang bagian refactoring menjadi latihan dalam "menulis fungsionalitas yang benar" daripada refactoring sejati implementasi. Jelas, menambahkan tes tambahan dengan parameter yang berbeda akan gagal dan memaksa refactoring, tetapi Anda harus mulai dengan satu tes itu.
Jadi, pertanyaan saya adalah, bagaimana Anda mendapatkan keseimbangan antara "menulis kode minimum untuk lulus tes" sambil tetap berfungsi dan dalam semangat apa yang sebenarnya Anda coba capai?