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 BitVectorto structprzechowuje singiel UInt64i 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
countNieruchomość typuIntisEmptyNieruchomość 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
countna coś musi działać na czymś, co nieuchronnie testuje moje inicjatoryWdrożenie
isEmptypolega nacountWdrożenie
==polega nacount.
Udało mi się częściowo rozwiązać ten problem, wprowadzając prywatny interfejs API, który konstruuje BitVectorz 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?
BitVectorjest idealnie drobnym rozmiarem jednostki do testów jednostkowych i natychmiast rozwiązuje problemy, których publiczni członkowieBitVectorpotrzebują się nawzajem w celu przeprowadzenia sensownych testów.