Коли ви робите TDD і пишете тестовий блок, як протистояти бажанням "обдурити" під час написання першої ітерації коду "впровадження", який ви тестуєте?
Наприклад:
Давайте мені потрібно обчислити Фактор числа. Я починаю з одиничного тестування (використовуючи MSTest) приблизно так:
[TestClass]
public class CalculateFactorialTests
{
[TestMethod]
public void CalculateFactorial_5_input_returns_120()
{
// Arrange
var myMath = new MyMath();
// Act
long output = myMath.CalculateFactorial(5);
// Assert
Assert.AreEqual(120, output);
}
}
Я запускаю цей код, і він не працює, оскільки CalculateFactorial
метод навіть не існує. Отже, я зараз пишу першу ітерацію коду для реалізації методу тестування, записуючи мінімальний код, необхідний для проходження тесту.
Справа в тому, що я постійно спокушаюся написати наступне:
public class MyMath
{
public long CalculateFactorial(long input)
{
return 120;
}
}
Це технічно правильно, оскільки це дійсно мінімальний код, необхідний для того, щоб зробити цей тестовий пропуск (зелений колір), хоча це, очевидно, "обман", оскільки він насправді навіть не намагається виконувати функцію обчислення факторіалу. Зрозуміло, тепер частина рефакторингу стає вправою "написання правильної функціональності", а не справжнім рефакторингом реалізації. Очевидно, що додавання додаткових тестів з різними параметрами не вдасться і не призведе до рефакторингу, але вам потрібно почати з цього одного тесту.
Отже, моє запитання полягає в тому, як ви отримуєте цей баланс між "написанням мінімального коду для проходження тесту", при цьому він залишається функціональним і в дусі того, що ви насправді намагаєтесь досягти?