Estoy tratando de practicar TDD, usándolo para desarrollar un simple como Bit Vector. Estoy usando Swift, pero esta es una pregunta independiente del lenguaje.
My BitVector
es un struct
que almacena un single UInt64
y presenta una API sobre él que le permite tratarlo como una colección. Los detalles no importan mucho, pero es bastante simple. Los 57 bits superiores son bits de almacenamiento, y los 6 bits inferiores son bits de "recuento", que le indica cuántos bits de almacenamiento almacenan realmente un valor contenido.
Hasta ahora, tengo un puñado de capacidades muy simples:
- Un inicializador que construye vectores de bits vacíos
- Una
count
propiedad de tipoInt
- Una
isEmpty
propiedad de tipoBool
- Un operador de igualdad (
==
). NB: este es un operador de igualdad de valores similar aObject.equals()
Java, no un operador de igualdad de referencia como==
en Java.
Me encuentro con un montón de dependencias cíclicas:
La prueba unitaria que prueba mi inicializador necesita verificar que el recién construido
BitVector
. Puede hacerlo de una de 3 maneras:- Comprobar
bv.count == 0
- Comprobar
bv.isEmpty == true
- Mira esto
bv == knownEmptyBitVector
El método 1 se basa
count
, el método 2 se basaisEmpty
(que en sí mismo dependecount
, por lo que no tiene sentido usarlo), el método 3 se basa==
. En cualquier caso, no puedo probar mi inicializador de forma aislada.- Comprobar
La prueba para
count
necesita operar en algo, que inevitablemente prueba mi (s) inicializador (es)La implementación de se
isEmpty
basa encount
La implementación de se
==
basa encount
.
Pude resolver en parte este problema introduciendo una API privada que construye a BitVector
partir de un patrón de bits existente (como a UInt64
). Esto me permitió inicializar valores sin probar ningún otro inicializador, de modo que pudiera "arrancar la correa" hacia arriba.
Para que mis pruebas unitarias sean realmente pruebas unitarias, me encuentro haciendo un montón de hacks, lo que complica sustancialmente mi código de prueba y prueba.
¿Cómo se resuelve exactamente este tipo de problemas?
BitVector
es un tamaño de unidad perfectamente fino para pruebas unitarias e inmediatamente resuelve sus problemas que los miembros públicos seBitVector
necesitan mutuamente para realizar pruebas significativas.