Próbuję ćwiczyć TDD, używając go do opracowania takiego prostego, jak Bit Vector. Zdarza mi się używać Swift, ale jest to pytanie zależne od języka.
My BitVector
to struct
przechowuje singiel UInt64
i przedstawia nad nim interfejs API, który pozwala traktować go jak kolekcję. Szczegóły nie mają większego znaczenia, ale jest to dość proste. Wysokie 57 bitów to bity pamięci, a dolne 6 bitów to bity „zliczające”, które informują, ile bitów pamięci faktycznie przechowuje zawartą wartość.
Do tej pory mam garść bardzo prostych możliwości:
- Inicjator, który konstruuje puste wektory bitowe
count
Nieruchomość typuInt
isEmpty
Nieruchomość typuBool
- Operator równości (
==
). Uwaga: jest to operator równości wartości podobny doObject.equals()
Javy, a nie referencyjny operator równości jak==
w Javie.
Wpadam na kilka cyklicznych zależności:
Test jednostkowy, który testuje mój inicjalizator, musi zweryfikować, czy nowo zbudowany
BitVector
. Można to zrobić na jeden z 3 sposobów:- Czek
bv.count == 0
- Czek
bv.isEmpty == true
- Sprawdź to
bv == knownEmptyBitVector
Metoda 1 polega na
count
, metoda 2 polega naisEmpty
( na czym sama polegacount
, więc nie ma sensu jej używać), metoda 3 polega na==
. W każdym razie nie mogę przetestować mojego inicjalizatora w izolacji.- Czek
Test
count
na coś musi działać na czymś, co nieuchronnie testuje moje inicjatoryWdrożenie
isEmpty
polega nacount
Wdrożenie
==
polega nacount
.
Udało mi się częściowo rozwiązać ten problem, wprowadzając prywatny interfejs API, który konstruuje BitVector
z istniejącego wzorca bitowego (jako a UInt64
). Pozwoliło mi to na zainicjowanie wartości bez testowania innych inicjatorów, dzięki czemu mogłem „uruchomić pasek” na swojej drodze.
Aby moje testy jednostkowe były naprawdę testami jednostkowymi, robię mnóstwo włamań, które znacznie komplikują mój kod prod i test.
Jak dokładnie radzisz sobie z tego rodzaju problemami?
BitVector
jest idealnie drobnym rozmiarem jednostki do testów jednostkowych i natychmiast rozwiązuje problemy, których publiczni członkowieBitVector
potrzebują się nawzajem w celu przeprowadzenia sensownych testów.