Это означает, что либо:
- Вы написали производственный код, который выполняет требуемую функцию, без предварительного написания теста (нарушение «религиозного 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);
}
проходит, вы не намеренно заставляете свой метод терпеть неудачу только для того, чтобы у вас был неудачный тест, чтобы вы могли написать новый код для того, чтобы пройти этот тест.