Коротка відповідь - «Ні». Більш цікава частина - чому / як може виникнути така ситуація.
Я думаю, що плутанина виникає через те, що ви намагаєтеся дотримуватися суворих методів тестування (одиничні тести проти інтеграційних тестів, глузування тощо) для коду, який, схоже, не дотримується суворих практик.
Це не означає, що код "неправильний", або що конкретні практики краще, ніж інші. Просто деякі припущення, зроблені методами тестування, можуть не застосовуватися в цій ситуації, і це може допомогти використовувати аналогічний рівень "суворості" в практиці кодування та тестуванні; або, принаймні, визнати, що вони можуть бути незбалансованими, що призведе до того, що деякі аспекти будуть непридатними або зайвими.
Найбільш очевидною причиною є те, що ваша функція виконує два різні завдання:
- Пошук на
Person
основі їх імені. Для цього потрібно тестування інтеграції, щоб переконатися, що він може знайти Person
об’єкти, які, імовірно, створені / зберігаються в іншому місці.
- Обчислення того, чи
Person
достатньо старий, виходячи з їх статі. Для цього потрібне тестування одиниць, щоб переконатися, що обчислення виконуються так, як очікувалося.
Згрупувавши ці завдання разом в один блок коду, ви не можете запустити одне без іншого. Коли ви хочете перевірити обчислення, ви змушені шукати Person
(з реальної бази даних або з заглушки / макету). Коли ви хочете перевірити, що пошук інтегрується з рештою системи, ви змушені також виконати розрахунок за віком. Що нам робити з цим розрахунком? Чи слід ігнорувати його чи перевіряти? Це, здається, є точним загрозою, яку ви описуєте у своєму запитанні.
Якщо ми уявляємо альтернативу, ми можемо мати розрахунок самостійно:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
Оскільки це чистий розрахунок, нам не потрібно проводити інтеграційні тести на ньому.
Ми також можемо спокуситись окремо написати завдання пошуку:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
Однак у цьому випадку функціональність наближена до того, Person::API.new
що я б сказав, що ви повинні використовувати це замість цього (якщо ім'я за замовчуванням необхідне, чи краще його зберігати в іншому місці, як атрибут класу?).
Коли ви пишете інтеграційні тести для Person::API.new
(або person_from_name
), все, що вам потрібно подбати, - чи повернете ви очікуване Person
; про всі розрахунки за віком доглядаються в інших місцях, тому ваші інтеграційні тести можуть їх ігнорувати.