Я пытаюсь попрактиковаться в TDD, используя его для разработки простого типа Bit Vector. Я использую Swift, но это не зависит от языка.
My BitVector
- это объект, struct
который хранит один UInt64
и представляет API, который позволяет вам рассматривать его как коллекцию. Детали не имеют большого значения, но все довольно просто. Старшие 57 бит - это биты хранения, а младшие 6 бит - это биты «подсчета», которые сообщают вам, сколько битов хранения на самом деле хранят содержащиеся значения.
Пока у меня есть несколько очень простых возможностей:
- Инициализатор, который создает пустые битовые векторы
count
Свойство типаInt
isEmpty
Свойство типаBool
- Оператор равенства (
==
). NB: это оператор равенства значений, похожий наObject.equals()
Java, а не оператор равенства ссылок, как==
в Java.
Я сталкиваюсь с кучей циклических зависимостей:
Модульный тест, который проверяет мой инициализатор, должен проверить, что он создан заново
BitVector
. Это можно сделать одним из 3 способов:- Проверьте
bv.count == 0
- Проверьте
bv.isEmpty == true
- Проверь это
bv == knownEmptyBitVector
Метод 1 основан на
count
методе 2isEmpty
(который сам по себе полагаетсяcount
, поэтому нет смысла его использовать), метод 3 использует==
. В любом случае, я не могу проверить свой инициализатор изолированно.- Проверьте
Тест
count
должен работать на чем-то, что неизбежно проверяет мой инициализатор (ы)Реализация
isEmpty
опирается наcount
Реализация
==
опирается наcount
.
Я смог частично решить эту проблему, представив частный API, который конструирует BitVector
из существующего битового шаблона (как UInt64
). Это позволило мне инициализировать значения без тестирования каких-либо других инициализаторов, чтобы я мог «загрузиться».
Чтобы мои модульные тесты действительно были модульными тестами, я обнаружил, что выполняю кучу хаков, которые существенно усложняют мой продукт и тестовый код.
Как именно вы справляетесь с такими проблемами?
BitVector
идеально подходит для модульного тестирования и сразу решает ваши проблемы, в которых публичные членыBitVector
нуждаются друг в друге для проведения значимых тестов.