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 struct
que armazena um único UInt64
e 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
count
propriedade do tipoInt
- Uma
isEmpty
propriedade 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
count
precisa operar com algo que inevitavelmente testa meus inicializadoresA implementação de se
isEmpty
baseia emcount
A implementação de
==
dependecount
.
Consegui resolver parcialmente esse problema, introduzindo uma API privada que constrói a BitVector
partir 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úblicosBitVector
precisam um do outro para fazer testes significativos.