ฉันต้องการสอนตัวเองให้ใช้วิธีการของ TDD และฉันก็มีโครงการที่ฉันอยากจะทำอยู่พักหนึ่ง มันไม่ใช่โครงการขนาดใหญ่ดังนั้นฉันคิดว่ามันจะเป็นตัวเลือกที่ดีสำหรับ TDD อย่างไรก็ตามฉันรู้สึกว่ามีบางอย่างผิดปกติ ขอยกตัวอย่าง:
ในระดับสูงโครงการของฉันเป็นส่วนเสริมสำหรับ Microsoft OneNote ที่จะให้ฉันติดตามและจัดการโครงการได้ง่ายขึ้น ตอนนี้ฉันยังต้องการให้ตรรกะทางธุรกิจสำหรับสิ่งนี้แยกออกจาก OneNote มากที่สุดในกรณีที่ฉันตัดสินใจที่จะสร้างที่เก็บข้อมูลที่กำหนดเองของฉันเองและกลับมาสิ้นสุดวันหนึ่ง
ก่อนอื่นฉันเริ่มต้นด้วยการทดสอบการยอมรับคำธรรมดาเบื้องต้นเพื่อสรุปสิ่งที่ฉันต้องการให้คุณสมบัติแรกของฉันทำ ดูเหมือนบางสิ่งนี้ (ทำให้ลดความกระชับลง):
- ผู้ใช้คลิกสร้างโครงการ
- ผู้ใช้พิมพ์ชื่อเรื่องของโครงการ
- ตรวจสอบว่าโครงการสร้างขึ้นอย่างถูกต้อง
ข้ามสิ่งที่ UI และการวางแผนตัวกลางฉันมาทดสอบหน่วยแรกของฉัน:
[TestMethod]
public void CreateProject_BasicParameters_ProjectIsValid()
{
var testController = new Controller();
Project newProject = testController(A.Dummy<String>());
Assert.IsNotNull(newProject);
}
จนถึงตอนนี้ดีมาก สีแดงเขียว refactor ฯลฯ เอาล่ะตอนนี้มันต้องการบันทึกของจริง ตัดขั้นตอนที่นี่ฉันปิดท้ายด้วยสิ่งนี้
[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);
}
ฉันยังรู้สึกดีในตอนนี้ ฉันยังไม่มีแหล่งข้อมูลที่เป็นรูปธรรม แต่ฉันสร้างอินเทอร์เฟซตามที่ฉันคาดไว้
ฉันจะข้ามไปไม่กี่ขั้นตอนที่นี่เพราะโพสต์นี้ใช้เวลานานพอ แต่ฉันทำตามกระบวนการที่คล้ายกันและในที่สุดฉันก็ถึงการทดสอบนี้สำหรับแหล่งข้อมูลของฉัน:
[TestMethod]
public void SaveNewProject_BasicParameters_RequestsNewPage()
{
/* snip init code */
testDataStore.SaveNewProject(A.Dummy<IProject>());
A.CallTo(() => oneNoteInterop.SavePage()).MustHaveHappened();
}
สิ่งนี้ดีจนกระทั่งฉันพยายามใช้:
public String SaveNewProject(IProject project)
{
Page projectPage = oneNoteInterop.CreatePage(...);
}
และมีปัญหาอยู่ตรงที่ "... " ฉันรู้แล้วว่า ณ จุดนี้ที่ CreatePage ต้องใช้ ID ของส่วน ฉันไม่ได้ตระหนักถึงสิ่งนี้ย้อนกลับไปเมื่อฉันคิดที่ระดับตัวควบคุมเพราะฉันเกี่ยวข้องกับการทดสอบบิตที่เกี่ยวข้องกับตัวควบคุมเท่านั้น อย่างไรก็ตามทุกอย่างลงมาที่นี่ตอนนี้ฉันรู้ว่าฉันต้องถามผู้ใช้สำหรับสถานที่ในการจัดเก็บโครงการ ตอนนี้ฉันต้องเพิ่มรหัสสถานที่ลงในที่เก็บข้อมูลจากนั้นเพิ่มรหัสหนึ่งในโครงการจากนั้นเพิ่มรหัสหนึ่งลงในตัวควบคุมและเพิ่มลงในการทดสอบทั้งหมดที่เขียนไว้สำหรับสิ่งเหล่านั้นทั้งหมด มันน่าเบื่ออย่างรวดเร็วและฉันก็อดไม่ได้ที่จะรู้สึกว่าฉันจะจับมันเร็วกว่านี้ถ้าฉันร่างการออกแบบล่วงหน้าแทนที่จะปล่อยให้มันถูกออกแบบในระหว่างกระบวนการ TDD
มีใครช่วยอธิบายให้ฉันหน่อยได้ไหมถ้าฉันทำอะไรผิดในขั้นตอนนี้? อย่างไรก็ตามมีการหลีกเลี่ยงการ refactoring ประเภทนี้หรือไม่? หรือเป็นเรื่องปกติ หากเป็นเรื่องปกติจะมีวิธีใดที่ทำให้เจ็บปวดมากขึ้นหรือไม่?
ขอบคุณทุกคน!