Jak robiąc TDD i pisząc test jednostkowy, jak oprzeć się pokusie „oszukiwania” podczas pisania pierwszej iteracji testowanego kodu „implementacyjnego”?
Na przykład:
muszę obliczyć silnię liczby. Zaczynam od testu jednostkowego (przy użyciu MSTest) czegoś takiego jak:
[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);
}
}
Uruchamiam ten kod i kończy się niepowodzeniem, ponieważ CalculateFactorial
metoda nawet nie istnieje. Więc teraz piszę pierwszą iterację kodu, aby zaimplementować testowaną metodę, pisząc minimalny kod wymagany do zaliczenia testu.
Chodzi o to, że ciągle mam ochotę napisać:
public class MyMath
{
public long CalculateFactorial(long input)
{
return 120;
}
}
Jest to technicznie poprawne, ponieważ tak naprawdę jest to minimalny kod wymagany do tego, aby ten konkretny test zdał (przejść na zielono), chociaż jest to oczywiście „oszustwo”, ponieważ tak naprawdę nie próbuje nawet wykonać funkcji obliczania silni. Oczywiście teraz część refaktoryzacji staje się ćwiczeniem w „pisaniu poprawnej funkcjonalności”, a nie prawdziwym refaktoryzowaniem implementacji. Oczywiście dodanie dodatkowych testów z różnymi parametrami zakończy się niepowodzeniem i wymusi refaktoryzację, ale musisz zacząć od tego jednego testu.
Moje pytanie brzmi więc, jak uzyskać równowagę między „pisaniem minimalnego kodu, aby przejść test”, a jednocześnie utrzymywać go w funkcjonowaniu i zgodnie z duchem tego, co faktycznie próbujesz osiągnąć?