Я хотів навчити себе використовувати підхід TDD, і у мене був проект, над яким я хотів працювати деякий час. Це був не великий проект, тому я вважав, що це буде хорошим кандидатом на TDD. Однак я відчуваю, що щось пішло не так. Наведу приклад:
На високому рівні мій проект є надбудовою для Microsoft OneNote, яка дозволить мені легше відстежувати та керувати проектами. Тепер я також хотів зберегти ділову логіку для цього, щоб якомога більше від'єднатись від OneNote, на випадок, якщо я вирішив створити власне власне сховище та задній кінець дня.
Спочатку я почав з базового тесту на прийняття простих слів, щоб окреслити те, що хотів зробити свою першу особливість. Це виглядає приблизно так (скидаючи його на стислість):
- Клацання користувача створюють проект
- Типи користувачів у назві проекту
- Переконайтеся, що проект створений правильно
Пропускаючи речі інтерфейсу та деяке посередницьке планування, я переходжу до свого першого тесту на одиницю:
[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 потрібен ідентифікатор розділу. Я не усвідомлював цього ще тоді, коли думав на рівні контролера, бо займався лише тестуванням бітів, що стосуються контролера. Однак, аж донизу тут я розумію, що я мушу попросити користувача про місце для зберігання проекту. Тепер мені потрібно додати ідентифікатор місцезнаходження в сховище даних, потім додати його до проекту, потім додати його до контролера та додати його до ВСІХ тестів, які вже написані для всіх цих речей. Це стало дуже нудно дуже швидко, і я не можу не стверджувати, що я би зловив це швидше, якби заздалегідь накреслив дизайн, а не дозволяв його розробляти під час процесу TDD.
Може хтось, будь ласка, пояснить мені, чи я зробив щось не так у цьому процесі? Чи все-таки можна уникнути подібного рефакторингу? Або це поширене? Якщо воно є загальним, чи є якісь способи зробити його більш безболісним?
Дякую всім!