Скажімо, ви пишете стиль TDD для гри Yahtzee. Ви хочете перевірити частину коду, яка визначає, чи є набір з п'яти рулонів штампу - це повний дім. Наскільки мені відомо, виконуючи TDD, ви дотримуєтесь цих принципів:
- Спочатку напишіть тести
- Напишіть найпростішу можливу річ, яка працює
- Уточнити і рефактор
Тож початковий тест може виглядати приблизно так:
public void Returns_true_when_roll_is_full_house()
{
FullHouseTester sut = new FullHouseTester();
var actual = sut.IsFullHouse(1, 1, 1, 2, 2);
Assert.IsTrue(actual);
}
Дотримуючись "Написати найпростішу можливу річ, яка працює", тепер слід написати такий IsFullHouse
спосіб:
public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5)
{
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)
{
return true;
}
return false;
}
Це призводить до зеленого тесту, але реалізація є неповною.
Чи слід перевіряти кожну можливу комбіновану комбінацію (як значень, так і позицій) для повного будинку? Це виглядає як єдиний спосіб бути абсолютно впевненим, що ваш IsFullHouse
код повністю перевірений і правильний, але це також звучить досить божевільно.
Як би ви перевірили щось подібне?
Оновлення
Ерік і Кіліан зазначають, що використання літералів у початковій реалізації для отримання зеленого тесту може бути не найкращою ідеєю. Я хотів би пояснити, чому я це зробив, і це пояснення не входить у коментар.
Мій практичний досвід тестування одиниць (особливо з використанням TDD-підходу) дуже обмежений. Пам’ятаю, як дивився запис майстер-класу TDD Роя Ошерова на Tekpub. В одному з епізодів він будує стиль StD Calculator TDD. Повну специфікацію калькулятора струн можна знайти тут: http://osherove.com/tdd-kata-1/
Він починає з такого тесту:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
Це призводить до цієї першої реалізації Add
способу:
public int Add(string input)
{
return 0;
}
Потім додається цей тест:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
І Add
метод реконструюється:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
Після кожного кроку Рой каже "Напишіть найпростішу річ, яка буде працювати".
Тому я подумав, що я спробую спробувати цей підхід, намагаючись зробити гру в Яхтзе в стилі TDD.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)