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 BitVectores un structque almacena un single UInt64y 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
countpropiedad de tipoInt - Una
isEmptypropiedad 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
countnecesita operar en algo, que inevitablemente prueba mi (s) inicializador (es)La implementación de se
isEmptybasa encountLa implementación de se
==basa encount.
Pude resolver en parte este problema introduciendo una API privada que construye a BitVectorpartir 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?
BitVectores un tamaño de unidad perfectamente fino para pruebas unitarias e inmediatamente resuelve sus problemas que los miembros públicos seBitVectornecesitan mutuamente para realizar pruebas significativas.