Я пытаюсь попрактиковаться в TDD, используя его для разработки простого типа Bit Vector. Я использую Swift, но это не зависит от языка.
My BitVector- это объект, structкоторый хранит один UInt64и представляет API, который позволяет вам рассматривать его как коллекцию. Детали не имеют большого значения, но все довольно просто. Старшие 57 бит - это биты хранения, а младшие 6 бит - это биты «подсчета», которые сообщают вам, сколько битов хранения на самом деле хранят содержащиеся значения.
Пока у меня есть несколько очень простых возможностей:
- Инициализатор, который создает пустые битовые векторы
countСвойство типаIntisEmptyСвойство типа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нуждаются друг в друге для проведения значимых тестов.