Como escrever o primeiro teste para uma funcionalidade “add”

5

Eu tive problemas para encontrar um bom título de pergunta, então sinta-se à vontade para melhorar.

Eu quero implementar um Sistema de componentes de entidades em C ++ e gostaria de usar o TDD pela primeira vez. Agora tenho dúvidas sobre a utilidade do TDD quando a "arquitetura" de destino já está especificada, mas quero tentar de qualquer maneira. Meu problema é mais um problema de TDD, e eu poderia ter encontrado isso em outro contexto também:

O primeiro teste deveria verificar se eu posso adicionar um Component a um Entity , já que Entity deveria "possuir" um conjunto de Component s (talvez este seja um teste ruim e o problema esteja aqui já? Até agora nenhum código existe e estou enfrentando um dilema que pode não ser um. Eu poderia escrever um teste que faz isso:

Entity e;
Component c;
e.add(c);

Mas como posso afirmar que o add funcionou corretamente? Eu sei que vou precisar de algum tipo de método has_component mais cedo ou mais tarde, mas eu não deveria implementar funcionalidade adicional agora, ou deveria? Eu também poderia fazer o Entity ter algum tipo de lista em sua interface pública e usá-lo no teste e refatorá-lo "depois".

Qual é a abordagem correta aqui? Pode ser que minha mentalidade para o TDD esteja totalmente errada, então sou grato por qualquer contribuição!

    
por InvisiblePanda 01.11.2016 / 18:02
fonte

1 resposta

4

Seu primeiro teste é um bom começo. Talvez pense na verificação de erros: existe um código de retorno do add, para dizer que funcionou ou não? Ou é suposto lançar uma exceção se algo der errado?

Abordagem preferencial

Sabendo que você precisará de um método has_component() para a classe Entity , basta adicioná-lo à definição da classe, com uma implementação stub que sempre retorna false (e um grande comentário // TO DO !! ).

Seu próximo teste seria então:

assert(! e.has_component(c) ); 
e.add(c);
assert(e.has_component(c)); // or return FAIL to your test framework.  

O princípio é que seu teste falhará até que as duas funções estejam corretas.

Quais são as alternativas

  • use um membro mais simples, como number_of_components() , para verificar se você está no caminho certo (ou seja, o número aumenta ao adicionar um novo componente; o número permanece o mesmo ao adicionar o mesmo componente duas vezes).
  • deixe o código de teste inspecionar os componentes internos do seu Entity . Eu não gosto dessa abordagem, porque quebra as regras de encapsulamento.
  • faça um teste duplo que forneça uma resposta simulada / emulada para has_component() . Seria uma característica muito complexa, este seria o caminho a percorrer. Mas para recursos simples como aqui, isso pode ser um exagero.
  • se você tiver uma função de envio que encaminha as chamadas de Entity para Components , você poderá usá-las para verificar se reage.
por 01.11.2016 / 18:33
fonte