У меня есть нетривиальный объект обслуживания, разработанный с помощью TDD.Это началось с простой задачи: для объекта из очереди создайте попытку асинхронной обработки.Итак, я написал тест для моего constructAttempt()
метода:
void constructAttempt() {...}
Существует множество возможных сценариев, которые необходимо принять во внимание, поэтому у меня есть дюжина тестов для этого метода.
Затем я реализовал то, что мне действительно нужно было сделать: отсканировать всю очередь и создать пакет попыток.Таким образом, код выглядит примерно так:
public void go() {
for (QueuedItem item : getQueuedItems()) {
constructAttempt(item);
}
}
Итак, я добавил новый или два теста для этого go()
метода.
Наконец я обнаружил, что мне нужна предварительная обработка, которая иногда можетвлияет constructAttempt()
.Теперь код выглядит примерно так:
public void go() {
preprocess();
for (QueuedItem item : getQueuedItems()) {
constructAttempt(item);
}
}
У меня есть несколько сомнений относительно того, что я должен делать сейчас.
Должен ли я оставить код как есть, с constructAttempt()
,preprocess()
и go()
проверены независимо?Почему да / почему нет?Я рискую не покрывать побочные эффекты предварительной обработки и прерывания инкапсуляции.
Или я должен реорганизовать весь свой набор тестов, чтобы вызвать только go()
(который является единственным открытым методом)?Почему да / почему нет?Это сделало бы тесты немного более неясными, но с другой стороны, было бы учтено все возможные взаимодействия.Фактически, это стало бы тестом «черного ящика» с использованием только открытого API, что может не соответствовать TDD.