Quando si esegue TDD e si scrive un unit test, come si fa a resistere all'impulso di "imbrogliare" quando si scrive la prima iterazione del codice di "implementazione" che si sta testando?
Ad esempio:
dobbiamo calcolare il fattoriale di un numero. Comincio con un unit test (usando MSTest) qualcosa del tipo:
[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);
}
}
Eseguo questo codice e non riesce poiché il CalculateFactorial
metodo non esiste nemmeno. Quindi, ora scrivo la prima iterazione del codice per implementare il metodo in prova, scrivendo il codice minimo richiesto per superare il test.
Il fatto è che sono continuamente tentato di scrivere quanto segue:
public class MyMath
{
public long CalculateFactorial(long input)
{
return 120;
}
}
Questo è, tecnicamente, corretto in quanto è davvero il codice minimo richiesto per far passare quel test specifico (diventa verde), anche se è chiaramente un "imbroglio" dal momento che in realtà non tenta nemmeno di svolgere la funzione di calcolo di un fattoriale. Naturalmente, ora la parte di refactoring diventa un esercizio di "scrittura della corretta funzionalità" piuttosto che un vero refactoring dell'implementazione. Ovviamente, l'aggiunta di test aggiuntivi con parametri diversi fallirà e forzerà un refactoring, ma devi iniziare con quel test.
Quindi, la mia domanda è: come si ottiene quell'equilibrio tra "scrivere il codice minimo per superare il test" pur mantenendolo funzionale e nello spirito di ciò che si sta effettivamente cercando di ottenere?