Ao fazer TDD e escrever um teste de unidade, como resistir ao desejo de "trapacear" ao escrever a primeira iteração do código de "implementação" que você está testando?
Por exemplo:
Vamos precisar calcular o fatorial de um número. Começo com um teste de unidade (usando o MSTest), algo como:
[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);
}
}
Eu executo esse código e ele falha, pois o CalculateFactorial
método nem existe. Portanto, agora escrevo a primeira iteração do código para implementar o método em teste, escrevendo o código mínimo necessário para passar no teste.
O problema é que sou continuamente tentado a escrever o seguinte:
public class MyMath
{
public long CalculateFactorial(long input)
{
return 120;
}
}
Tecnicamente, isso é correto, na medida em que realmente é o código mínimo necessário para fazer esse teste específico passar (verde), embora seja claramente uma "fraude", pois nem sequer tenta executar a função de calcular um fatorial. Obviamente, agora a parte da refatoração se torna um exercício para "escrever a funcionalidade correta" em vez de uma refatoração verdadeira da implementação. Obviamente, a adição de testes adicionais com parâmetros diferentes falhará e forçará uma refatoração, mas você deve começar com esse teste.
Então, minha pergunta é: como você consegue esse equilíbrio entre "escrever o código mínimo para passar no teste" enquanto ainda o mantém funcional e no espírito do que você está realmente tentando alcançar?