나는 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);
}
여태까지는 그런대로 잘됐다. 빨강, 초록, 리팩터링 등. 이제 실제로 물건을 저장해야합니다. 여기 몇 단계를 잘라 내고 이것으로 마무리합니다.
[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가 필요하다는 것을 알았습니다. 컨트롤러 수준에서 생각할 때 컨트롤러와 관련된 비트 테스트에만 관심이 있었기 때문에 이것을 다시 알지 못했습니다. 그러나 이제는 프로젝트를 저장할 위치를 사용자에게 요청해야한다는 것을 알았습니다. 이제 데이터 저장소에 위치 ID를 추가 한 다음 프로젝트에 하나를 추가 한 다음 컨트롤러에 하나를 추가하고 모든 것을 위해 이미 작성된 모든 테스트에 추가해야합니다. 그것은 매우 지루 해졌고, 도움이 될 수는 없지만 TDD 프로세스 중에 디자인되도록하지 않고 미리 디자인을 스케치하면 더 빨리 잡았을 것입니다.
이 과정에서 내가 잘못한 것을 누군가 설명해 주시겠습니까? 어쨌든 이런 종류의 리팩토링을 피할 수 있습니까? 아니면 이것이 일반적입니까? 일반적인 경우 더 고통없이 만드는 방법이 있습니까?
모두 감사합니다!