Починаючи з цієї концепції:
1) Почніть з тієї поведінки, якої ви бажаєте. Напишіть для нього тест. Дивіться невдачу тесту.
2) Напишіть достатньо коду, щоб пройти тест. Переглянути всі проходження тестів.
3) Шукайте зайвий / неохайний код -> рефактор. Дивіться тести ще проходять. Перейти 1
Отже, на # 1 скажімо, що ви хочете створити нову команду (я тягнуся до того, як команда працювала, тому поводьтеся зі мною). (Також я буду трохи прагматичнішим, а не екстремальним TDD)
Нова команда називається MakeMyLunch, тому ви спершу створите тест, щоб інстанціювати її та отримати ім'я команди:
@Test
public void instantiateMakeMyLunch() {
ICommand command = new MakeMyLunchCommand();
assertEquals("makeMyLunch",command.getCommandName());
}
Це не вдається, змушуючи вас створити новий клас команд і дати йому повернути свою назву (пурист сказав би, що це два раунди TDD, а не 1). Отже, ви створюєте клас і надаєте йому реалізувати інтерфейс ICommand, включаючи повернення імені команди. Запуск усіх тестів тепер показує всю прохідність, тому ви продовжуєте шукати можливості рефакторингу. Напевно, жодного.
Тож далі ви хочете, щоб він виконав Execute. Тож ви повинні запитати: як я знаю, що "MakeMyLunch" успішно "зробив мій обід". Які зміни в системі через цю операцію? Чи можу я перевірити це?
Припустимо, це легко перевірити на:
@Test
public void checkThatMakeMyLunchIsSuccessful() {
ICommand command = new MakeMyLunchCommand();
command.execute();
assertTrue( Lunch.isReady() );
}
В іншому випадку це складніше, і те, що ви насправді хочете зробити, - це перевірити обов'язки суб'єкта, що перебуває під тестом (MakeMyLunchCommand). Можливо, відповідальність MakeMyLunchCommand полягає у взаємодії з холодильником та мікрохвильовою піччю. Тому для тестування ви можете використовувати макет Холодильник та знущатися з Мікрохвильовки. [дві зразкові схеми макету - Mockito і nMock або дивіться тут .]
У такому випадку ви зробите щось на зразок наступного псевдокоду:
@Test
public void checkThatMakeMyLunchIsSuccessful() {
Fridge mockFridge = mock(Fridge);
Microwave mockMicrowave = mock(Microwave);
ICommand command = new MakeMyLunchCommand( mockFridge, mockMicrowave );
command.execute();
mockFramework.assertCalled( mockFridge.removeFood );
mockFramework.assertCalled( microwave.turnon );
}
Пурист каже перевірити відповідальність вашого класу - його взаємодії з іншими класами (чи команда відкрила холодильник і включила мікрохвильову піч?).
Прагматик каже тест на групу занять і тест на результат (чи готовий ваш обід?).
Знайдіть правильний баланс, який працює для вашої системи.
.