Це означає, що або:
- Ви написали виробничий код, який відповідає необхідній функції, не спершу написавши тест (порушення "релігійної TDD"), або
- Функція, яка вам потрібна, вже виконана виробничим кодом, і ви просто пишете ще один тестовий пристрій для покриття цієї функції.
Остання ситуація частіше, ніж можна подумати. Як цілком пристойний і тривіальний (але все-таки показовий) приклад, скажімо, що ви написали наступний одиничний тест (псевдокод, тому що я лінивий):
public void TestAddMethod()
{
Assert.IsTrue(Add(2,3) == 5);
}
Тому що все, що вам дійсно потрібно, - це результат 2 і 3, що додаються разом.
Вашим методом реалізації буде:
public int add(int x, int y)
{
return x + y;
}
Але скажімо, зараз мені потрібно додати 4 і 6 разом:
public void TestAddMethod2()
{
Assert.IsTrue(Add(4,6) == 10);
}
Мені не потрібно переписувати свій метод, оскільки він вже охоплює другий випадок.
Тепер скажімо, що я з’ясував, що для моєї функції Add дійсно потрібно повернути число, яке має деяку стелю, скажімо, 100. Я можу написати новий метод, який тестує це:
public void TestAddMethod3()
{
Assert.IsTrue(Add(100,100) == 100);
}
І це випробування тепер не вдасться. Тепер я повинен переписати свою функцію
public int add(int x, int y)
{
var a = x + y;
return a > 100 ? 100 : a;
}
щоб змусити його пройти.
Здоровий глузд диктує, що якщо
public void TestAddMethod2()
{
Assert.IsTrue(Add(4,6) == 10);
}
пропуски, ви навмисно не змушуєте ваш метод вийти з ладу просто для того, щоб у вас був невдалий тест, щоб ви могли написати новий код, щоб зробити цей тестовий пропуск.