Khi thực hiện TDD và viết một bài kiểm tra đơn vị, làm thế nào một người chống lại sự thôi thúc "gian lận" khi viết lần lặp đầu tiên của mã "thực thi" mà bạn đang kiểm tra?
Ví dụ:
Chúng ta cần tính Nhân tố của một số. Tôi bắt đầu với một bài kiểm tra đơn vị (sử dụng MSTest) đại loại như:
[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);
}
}
Tôi chạy mã này và nó thất bại vì CalculateFactorial
phương thức thậm chí không tồn tại. Vì vậy, bây giờ tôi viết lần lặp đầu tiên của mã để thực hiện phương thức đang thử nghiệm, viết mã tối thiểu cần thiết để vượt qua thử nghiệm.
Vấn đề là, tôi liên tục bị cám dỗ để viết như sau:
public class MyMath
{
public long CalculateFactorial(long input)
{
return 120;
}
}
Về mặt kỹ thuật, điều này đúng ở chỗ nó thực sự là mã tối thiểu cần thiết để thực hiện bài kiểm tra cụ thể đó ( chuyển sang màu xanh lá cây), mặc dù rõ ràng đó là một "trò gian lận" vì nó thực sự thậm chí không cố gắng thực hiện chức năng tính toán giai thừa. Tất nhiên, bây giờ phần tái cấu trúc trở thành một bài tập trong "viết đúng chức năng" chứ không phải là tái cấu trúc thực sự của việc thực hiện. Rõ ràng, việc thêm các thử nghiệm bổ sung với các tham số khác nhau sẽ thất bại và buộc tái cấu trúc, nhưng bạn phải bắt đầu với thử nghiệm đó.
Vì vậy, câu hỏi của tôi là, làm thế nào để bạn có được sự cân bằng giữa "viết mã tối thiểu để vượt qua bài kiểm tra" trong khi vẫn giữ cho nó hoạt động và theo tinh thần của những gì bạn đang thực sự đạt được?