Tôi muốn dạy bản thân sử dụng phương pháp TDD và tôi đã có một dự án mà tôi đã muốn thực hiện trong một thời gian. Đó không phải là một dự án lớn nên tôi nghĩ nó sẽ là một ứng cử viên sáng giá cho TDD. Tuy nhiên, tôi cảm thấy như có gì đó không ổn. Để tôi lấy một ví dụ:
Ở cấp độ cao, dự án của tôi là một bổ trợ cho Microsoft OneNote cho phép tôi theo dõi và quản lý Dự án dễ dàng hơn. Bây giờ, tôi cũng muốn giữ logic kinh doanh cho việc này được tách rời khỏi OneNote trong trường hợp có thể trong trường hợp tôi quyết định xây dựng bộ lưu trữ tùy chỉnh của riêng mình và kết thúc một ngày nào đó.
Đầu tiên tôi bắt đầu với một bài kiểm tra chấp nhận từ đơn giản cơ bản để phác thảo những gì tôi muốn tính năng đầu tiên của mình làm. Nó trông giống như thế này (làm giảm nhiệt độ của nó):
- Nhấp chuột tạo dự án
- Kiểu người dùng trong tiêu đề của dự án
- Xác minh rằng dự án được tạo chính xác
Bỏ qua các công cụ UI và một số kế hoạch trung gian Tôi đến thử nghiệm đơn vị đầu tiên của mình:
[TestMethod]
public void CreateProject_BasicParameters_ProjectIsValid()
{
var testController = new Controller();
Project newProject = testController(A.Dummy<String>());
Assert.IsNotNull(newProject);
}
Càng xa càng tốt. Đỏ, xanh lá cây, tái cấu trúc, v.v ... Bây giờ nó cần thực sự tiết kiệm công cụ. Cắt ra một số bước ở đây tôi kết thúc với điều này.
[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);
}
Tôi vẫn cảm thấy tốt ở điểm này. Tôi chưa có một kho lưu trữ dữ liệu cụ thể, nhưng tôi đã tạo giao diện như tôi dự đoán nó sẽ trông như thế nào.
Tôi sẽ bỏ qua một vài bước ở đây vì bài đăng này đã đủ dài, nhưng tôi đã làm theo các quy trình tương tự và cuối cùng tôi nhận được bài kiểm tra này cho kho dữ liệu của mình:
[TestMethod]
public void SaveNewProject_BasicParameters_RequestsNewPage()
{
/* snip init code */
testDataStore.SaveNewProject(A.Dummy<IProject>());
A.CallTo(() => oneNoteInterop.SavePage()).MustHaveHappened();
}
Điều này là tốt cho đến khi tôi cố gắng thực hiện nó:
public String SaveNewProject(IProject project)
{
Page projectPage = oneNoteInterop.CreatePage(...);
}
Và đó là vấn đề ngay tại nơi "...". Bây giờ tôi nhận ra rằng tại điểm NÀY, CreatPage yêu cầu ID phần. Tôi đã không nhận ra điều này khi tôi nghĩ ở cấp độ bộ điều khiển vì tôi chỉ quan tâm đến việc kiểm tra các bit có liên quan đến bộ điều khiển. Tuy nhiên, đến tận bây giờ tôi mới nhận ra mình phải hỏi người dùng địa điểm để lưu trữ dự án. Bây giờ tôi phải thêm ID vị trí vào kho dữ liệu, sau đó thêm một vào dự án, sau đó thêm một vào bộ điều khiển và thêm nó vào TẤT CẢ các bài kiểm tra đã được viết cho tất cả những điều đó. Nó đã trở nên tẻ nhạt rất nhanh và tôi không thể không cảm thấy mình sẽ nắm bắt được điều này nhanh hơn nếu tôi phác thảo thiết kế trước thời hạn thay vì để nó được thiết kế trong quá trình TDD.
Ai đó có thể vui lòng giải thích cho tôi nếu tôi đã làm điều gì sai trong quá trình này? Có cách nào để tái cấu trúc loại này có thể tránh được không? Hay điều này là phổ biến? Nếu nó là phổ biến thì có cách nào làm cho nó không đau hơn không?
Cảm ơn tất cả!