Estou tentando praticar o TDD, usando-o para desenvolver um simples como o Bit Vector. Por acaso, estou usando o Swift, mas essa é uma pergunta independente da linguagem.
My BitVectoré um structque armazena um único UInt64e apresenta uma API sobre ele que permite tratá-lo como uma coleção. Os detalhes não importam muito, mas são bem simples. Os 57 bits altos são bits de armazenamento e os 6 bits inferiores são bits de "contagem", o que indica quantos bits de armazenamento realmente armazenam um valor contido.
Até agora, tenho um punhado de recursos muito simples:
- Um inicializador que constrói vetores de bits vazios
- Uma
countpropriedade do tipoInt - Uma
isEmptypropriedade do tipoBool - Um operador de igualdade (
==). Nota: este é um operador de igualdade de valor semelhante aoObject.equals()Java, não um operador de igualdade de referência como==no Java.
Estou enfrentando várias dependências cíclicas:
O teste de unidade que testa meu inicializador precisa verificar se o recém-construído
BitVector. Isso pode ser feito de três maneiras:- Verifica
bv.count == 0 - Verifica
bv.isEmpty == true - Verifique que
bv == knownEmptyBitVector
O método 1 depende
count, o método 2 dependeisEmpty(o qual dependecount, então não faz sentido usá-lo), o método 3 depende==. De qualquer forma, não consigo testar meu inicializador isoladamente.- Verifica
O teste
countprecisa operar com algo que inevitavelmente testa meus inicializadoresA implementação de se
isEmptybaseia emcountA implementação de
==dependecount.
Consegui resolver parcialmente esse problema, introduzindo uma API privada que constrói a BitVectorpartir de um padrão de bits existente (como a UInt64). Isso me permitiu inicializar valores sem testar nenhum outro inicializador, para que eu pudesse "arrancar a correia" no meu caminho.
Para que meus testes de unidade sejam realmente testes de unidade, eu me vejo fazendo um monte de hacks, o que complica substancialmente meu código de teste e teste.
Como exatamente você contorna esses tipos de problemas?
BitVectoré um tamanho de unidade perfeitamente adequado para testes de unidade e resolve imediatamente seus problemas de que os membros públicosBitVectorprecisam um do outro para fazer testes significativos.