Digamos que você esteja escrevendo um estilo TDD de jogo Yahtzee. Você deseja testar a parte do código que determina se um conjunto de cinco rolagens é ou não uma casa cheia. Tanto quanto eu sei, ao fazer TDD, você segue estes princípios:
- Escreva os testes primeiro
- Escreva a coisa mais simples possível que funcione
- Refinar e refatorar
Portanto, um teste inicial pode ser algo como isto:
public void Returns_true_when_roll_is_full_house()
{
FullHouseTester sut = new FullHouseTester();
var actual = sut.IsFullHouse(1, 1, 1, 2, 2);
Assert.IsTrue(actual);
}
Ao seguir a "Escreva a coisa mais simples possível que funcione", você deve agora escrever o IsFullHouse
método assim:
public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5)
{
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)
{
return true;
}
return false;
}
Isso resulta em um teste verde, mas a implementação está incompleta.
Você deve testar todas as combinações válidas possíveis (valores e posições) para uma casa cheia? Essa é a única maneira de ter certeza absoluta de que seu IsFullHouse
código está completamente testado e correto, mas também parece bastante insano fazer isso.
Como você testaria unitariamente algo assim?
Atualizar
Erik e Kilian apontam que o uso de literais na implementação inicial para obter um teste verde pode não ser a melhor idéia. Eu gostaria de explicar por que fiz isso e essa explicação não se encaixa em um comentário.
Minha experiência prática com testes de unidade (especialmente usando uma abordagem TDD) é muito limitada. Lembro-me de assistir a uma gravação da TDD Masterclass de Roy Osherove no Tekpub. Em um dos episódios, ele constrói um estilo TDD da String Calculator. A especificação completa da Calculadora de cordas pode ser encontrada aqui: http://osherove.com/tdd-kata-1/
Ele começa com um teste como este:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
Isso resulta nesta primeira implementação do Add
método:
public int Add(string input)
{
return 0;
}
Então este teste é adicionado:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
E o Add
método é refatorado:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
Depois de cada passo, Roy diz "Escreva a coisa mais simples que funcionará".
Então, pensei em experimentar essa abordagem ao tentar fazer um jogo Yahtzee no estilo TDD.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)